Node.js(day4) (3)

根据路由设计,写出请求结构:

//主页 app.get('http://www.likecs.com/',(req,res) => { }); //学生信息页 app.get('/students',(req,res) => { }); //增加学生信息页 app.get('http://www.likecs.com/students/add',(req,res) => { }); //增加学生 app.post('http://www.likecs.com/students/add',(req,res) => { }); //删除学生 app.get('/students/delete',(req,res) => { }); //修改学生 app.post('/students/modify',(req,res) => { });

一般为了方便管理,也符合更好地设计思路,我们把这些请求单独放到一个js中,让每个js即每个模块都有各自统一的功能,而不是很杂:

app.js:程序的入口,负责服务器的创建及相关配置。

router.js:路由管理模块,存放路由设计信息。
那么现在就有一个问题,如果将上面的代码直接放到router.js中,该如何调用?使用exports | module.exports即可。

3.使用json文件来充当数据库 既然要实现信息的CRUD,就需要一个数据库,但我们暂不需要使用数据库,使用一个json文件保存学生信息即可。

db.json

{ "students":[ {"id":1,"name":"Tom","gender":0,"age":18,"hobbies":"吃饭睡觉打豆豆"}, {"id":2,"name":"Lucy","gender":0,"age":20,"hobbies":"吃饭睡觉打豆豆"}, {"id":3,"name":"Michel","gender":0,"age":4,"hobbies":"吃饭睡觉打豆豆"}, {"id":4,"name":"Afile","gender":0,"age":33,"hobbies":"吃饭睡觉打豆豆"}, {"id":5,"name":"Joky","gender":0,"age":45,"hobbies":"吃饭睡觉打豆豆"} ] }

测试一下:

app.js

var express = require('express'); var bodyParser = require('body-parser'); var app = express(); app.listen('8080',() => { console.log('server running at 8080'); }); //配置 app.use('/public',express.static('./public')); app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })) //路由 var router = require('./router.js'); router(app);

router.js

module.exports = function(app){ var fs = require('fs'); //主页(直接跳到学生信息页好了) app.get('http://www.likecs.com/',(req,res) => { res.redirect(302,'/students'); }); //学生信息页 app.get('/students',(req,res) => { //使用fs读取json文件 fs.readFile('./db.json','utf8',(err,data) => { if(err) return res.status(500).send('500'); var students = JSON.parse(data).students; res.render('./index.html',{ "students":students }); }); }); //增加学生信息页 app.get('http://www.likecs.com/students/add',(req,res) => { res.render('./add.html'); }); //增加学生 app.post('http://www.likecs.com/students/add',(req,res) => { }); //删除学生 app.get('/students/delete',(req,res) => { res.send('delete ok'); }); //修改学生 app.post('/students/modify',(req,res) => { res.send('modify ok'); }); }

效果:

Node.js(day4)

4.封装操作db.json文件的方法

在CRUD中我们会多次使用fs来读取文件,为了方便调用,我们有必要对重复性的工作进行封装。

student.js

var fs = require('fs'); /* 将students放到db.json中 */ function write(students){ var db = { "students":students }; var dbStr = JSON.stringify(db); fs.writeFile('./db.json',dbStr,'utf8',(err) => { if(err){ return false; } }); } /*获取全部学生信息 return students[] */ function queryAll(callback){ fs.readFile('./db.json','utf8',(err,data) => { if(err){ callback({}); } var students = JSON.parse(data).students; callback(students); }); } /*根据id获取一个学生信息 return Obj || null */ function queryById(id,callback){ queryAll((students) => { var stu = null; students.forEach((value,index) => { if(value.id === id){ stu = value; return; } }); callback(stu); }); } /*增加一个学生 */ function add(stu){ queryAll((students) => { students.push(stu); write(students); }); } /*删除一个学生 return stu */ function del(id,callback){ queryById(id,(stu) => { if(stu === null){ callback(stu); return; } queryAll((students) => { students = students.filter((value,index) => { return value.id !== id; }); write(students); callback(stu); }); }); } /*修改一个学生 return Boolean */ function modify(stu,callback){ queryById(stu.id,(flag) => { if(flag === null){ callback(false); return; } queryAll((students) => { students = students.map((value,index) => { if(value.id === stu.id){ return stu; }else{ return value; } }); write(students); callback(true); }); }); } //将方法导出 exports.queryAll = queryAll; exports.queryById = queryById; exports.add = add; exports.delete = del; exports.modify = modify;

值得注意的是,由于fs读取文件是异步操作,而我们又需要异步操作的结果,那我们就需要使用回调函数来获取异步操作的结果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzpzf.html