node js学习

node js留言板练习

学习视频地址:https://www.bilibili.com/video/av27670326/?p=69

node js代码

const http = require("http");
const fs = require("fs");
const url = require("url");
const template = require("art-template");

//模拟留言数据
const msgs = [
    {name:"张三1",msg:"测试1",date:"2012-12-12"},
    {name:"张三2",msg:"测试2",date:"2012-12-12"},
    {name:"张三3",msg:"测试3",date:"2012-12-12"},
    {name:"张三4",msg:"测试4",date:"2012-12-12"}
];

http.createServer(function (req,res) {
    //获取参数前面的请求路径
    const parseObj = url.parse(req.url,true);
    const pathname = parseObj.pathname;
    //跳转到首页
    if(pathname === "/" || pathname === "/index.html"){
        fs.readFile("../index.html",function (err,data) {
            if(err){
                return res.end("404 not found...");
            }
            //使用art-template模版引擎进行后端数据渲染
            const renderHtml = template.render(data.toString(),{msgs:msgs});
            res.end(renderHtml);
            return;
        });
    }
    //访问指定到静态资源目录的文件,提供访问服务
    else if(pathname.indexOf("/www") === 0){
        fs.readFile(".."+pathname,function (err,data) {
            if(err){
                return;
            }
            res.end(data);
        })
    }else if(pathname.indexOf("/msg") == 0){
        fs.readFile("../www/msg.html",function (err,data) {
            if(err){
                return;
            }
            res.end(data);
        })
    }else if(pathname === "/send"){
        //获取请求参数
        const params = parseObj.query;
        params.date = "2019-12-12";
        //将元素插入到数组到头部
        msgs.unshift(params);
        //重定向到首页
        res.statusCode = 302;
        res.setHeader("Location","/");
        res.end();
    }else {
        res.end("404 not found...");
    }
}).listen(3000,function () {
    console.log("服务器启动完毕");
});

首页html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>node</title>
    <link rel="stylesheet" href="www/css/index.css">
</head>
<body>
<h1>留言内容</h1>
<a href="/msg">开始留言</a>
<ul>
    {{each msgs}}
        <li>{{ $value.name }}说:{{ $value.msg }} <span>{{ $value.date }}</span></li>
    {{/each}}
</ul>


</body>
</html>

首页css代码

span{
    float: right;
}

留言页html代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>开始留言</title>
</head>
<body>
<form action="/send">
    <label for="name">姓名</label><input id="name" type="text" name="name"><br />
    <label for="msg">消息</label><input id="msg" type="text" name="msg"><br />
    <input type="submit" />
</form>
</body>
</html>

node js使用淘宝镜像

镜像说明地址:http://npm.taobao.org/

node中使用方式一

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装后使用cnpm替换npm命令

node中使用方式二【个人推荐】

npm config set registry https://registry.npm.taobao.org
// 配置完成后  可通过以下命令查看
npm config list

如果出现以下文字说明配置成功


配置成功

express模块的使用

入门demo

const express = require("express");
//创建服务器应用程序,相当于http.createServer
const app = express();


app.get("/",function (req,res) {
    res.end("hello express");
});

//指定公开目录,相当于java项目中的webcontent目录
app.use("/www",express.static("../www/"));


//设置端口,相当于server.listen();
app.listen(3000,function () {
    console.log("服务器启动成功");
});

nodemon自动重启服务器

sudo npm install -g nodemon

mac不加sudo会安装错误,提示没有权限
使用nodemon很简单,将以前的node命令变为 nodemon 如:node hello.js 变为 nodemon.js

在Express中使用art-template模板引擎

//使用express-art-template之前,需要安装art-template和express-art-template
const express = require("express");

//创建服务器应用程序,相当于http.createServer
const app = express();

//配置使用art-template模版引擎,第一个参数表示渲染以.art结尾的文件时,使用art-template模版引擎
//express-art-template是专门用来在Express中把art-template整合到Express中,虽然外面这里不需要加载art-template但是也必须安装
//原因在于express-art-template。如果不想以.art结尾,可以改为.html
// app.engine("art",require("express-art-template"));
app.engine("html",require("express-art-template"));

//由于response.render();默认从views目录加载文件。可以通过这个方法改变默认加载路径
app.set("views","../pages");

//渲染页面
app.get("/test",function (req,res) {
    res.render("test.html",{title:"测试"})
})

//设置端口,相当于server.listen();
app.listen(3000,function () {
    console.log("服务器启动成功");
});

node js学生管理系统,增删改查

初始化app.js

const express = require("express");
const fs = require("fs");
//安装body-parser的命令:npm install --save body-parser。该模块可以解析post请求中的请求参数
const bodyParser = require("body-parser");
//获取自定的路由
const router = require("./router");

//使用express创建服务器
const app = express();

//指定渲染格式,默认为art结尾的文件,这里改为html默认目录为viwes。安装该模板引擎命令:npm install --save art-template express-art-template
app.engine("html",require("express-art-template"));

//配置模版引擎和body-parser一定要在app.use(router);挂在路由之前
app.use(bodyParser.urlencoded({extended:true}));
app.use(bodyParser.json());

//开发静态资源访问目录
app.use("/node_modules/",express.static("./node_modules/"));
app.use("/public/",express.static("./public/"));

//加载路由容器挂在到app服务中
app.use(router);

app.listen(3000,function () {
    console.log("启动成功");
})

路由router.js

/**
 * 路由模块
 */
const fs = require("fs");
//express提供了一个更好的方式专门包装路由
const express = require("express");
//加载自定义的数据操作工具类,定义数据的增删改查
const studentUtil = require("./students")
//1、创建一个路由容器
const router = express.Router();

//2、把router都挂在到router中
router.get("/students",function (req,res) {
    studentUtil.find(function (err,data) {
        if(err){
            //设置状态码,并返回值
            return res.status(500).send("server error");
        }
        res.render("index.html",{
            fruits:["苹果","香蕉","橘子","芒果"],
            //从文件中读取students并转为json格式渲染
            students:data
        });
    })
})

router.get("/students/new",function (req,res) {
    res.render("new.html");
})

router.post("/students/new",function (req,res) {
    //获取请求中的表单数据
    const student = req.body;
    //将数据保存到本地的db.json中
    studentUtil.save(student,function (err) {
        if(err){
            return res.status(500).send("server error");
        }
    })
    //发送响应,跳转到首页
    res.redirect("/students");
})

router.get("/students/edit",function (req,res) {
    const id = parseInt(req.query.id);
    studentUtil.getStudentById(id,function (err,data) {
        res.render("edit.html",{student:data});
    });
})

router.post("/students/edit",function (req,res) {
    //获取提交的修改学生信息
    const student = req.body;
    //更新数据
    studentUtil.update(student,function (err) {
        if(err){
            return res.status(500).send("server error")
        }
        res.redirect("/students");
    })
})

router.get("/students/delete",function (req,res) {
    studentUtil.delete(req.query.id,function (err) {
        if(err){
            return res.status(500).send("server error")
        }
        res.redirect("/students");
    })
})


//3、把router导出
module.exports = router;

文件操作student.js操作

/*
*数据操作文件模块,对本地文件的db.json的增删改查
*/
const fs = require("fs");

//文件路径
const dbPath = "./db.json";

//获取所有学生列表,返回数组。
exports.find = function (callback) {
   fs.readFile(dbPath,"utf-8",function (err,data) {
       if(err){
           return callback(err);
       }
       callback(null,JSON.parse(data).students);
   })
}

//根据学生id获取学生信息
exports.getStudentById = function(id,callback){
   fs.readFile(dbPath,"utf-8",function (err,data) {
       if(err){
           return callback(err);
       }
       const readStudents = JSON.parse(data).students;
       const student = readStudents.find(function (item) {
           return item.id === id;
       });
       callback(null,student);
   })
}

//添加学生,如果出错返回错误信息
exports.save = function (student,callback) {
   fs.readFile(dbPath,"utf-8",function (err,data) {
       if(err){
           return callback(err);
       }
       //获取文件中的学生信息
       const readData = JSON.parse(data).students;
       //设置学生id为最后一个加一
       student.id = readData[readData.length - 1].id + 1;

       //将新添加的学生加入到已存在的学生中
       readData.push(student);
       const resultData = JSON.stringify({students: readData});
       //写入文件
       fs.writeFile(dbPath,resultData,function (err) {
           if(err){
               return callback(err);
           }
           callback();
       })
   })
}

//更新学生
exports.update = function (student,callback) {
   fs.readFile(dbPath,"utf-8",function (err,data) {
       if(err){
           return callback(err);
       }
       //将学生ID设置为int型
       student.id = parseInt(student.id);
       //获取文件中的学生信息
       const readStudents = JSON.parse(data).students;
       const targetStudent = readStudents.find(function (item) {
           return item.id === student.id;
       });
       //将更行数据写入到文件获取到对象中
       for(let key in student){
           targetStudent[key] = student[key];
       }
       const resultData = JSON.stringify({students: readStudents});
       //写入文件
       fs.writeFile(dbPath,resultData,function (err) {
           if(err){
               return callback(err);
           }
           callback();
       })
   });
}

//删除学生
exports.delete = function (id,callback) {
   fs.readFile(dbPath,"utf-8",function (err,data) {
       if(err){
           return callback(err);
       }
       //将学生ID设置为int型
       id = parseInt(id);
       //获取文件中的学生信息
       const readStudents = JSON.parse(data).students;
       //获取要删除学生在数组的下标
       const itemIndex = readStudents.findIndex(function (item) {
           return item.id === id;
       });
       //根据下标删除对应的学生数据,splice方法第一个参数是要删除的位置,第二个参数是删除多少个
       readStudents.splice(itemIndex,1);
       const resultData = JSON.stringify({students: readStudents});
       //写入文件
       fs.writeFile(dbPath,resultData,function (err) {
           if(err){
               return callback(err);
           }
           callback();
       })
   });
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 上一节-node.js学习(8)—npm介绍以及自定义模块的发布 本节我们开始讲解express。首先我们回顾下之...
    YINdevelop阅读 1,316评论 1 3
  • 创建文件夹,并转到文件夹 2、npm init 生成一份最简单的package.json 3、npm instal...
    番茄尼个西红柿阅读 337评论 0 0
  • 1.events模块 events模块的使用主要有四步首先require我们的events模块,然后创建一个eve...
    恰似一碗咸鱼粥阅读 378评论 2 0
  • 下列列举一下我的技术栈,大体上符合我的路线,具体技术上有会的,也有不会。 列一下这个,主要是想,大家在学习的时候要...
    taosilly阅读 1,850评论 2 23
  • npmjs.com说:npm能让javascript开发人员发布代码和复用代码变得更容易.并别能非常容易的让别人将...
    _palm阅读 2,270评论 0 0