根据路由设计,写出请求结构:
//主页 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即可。
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'); }); }效果:
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读取文件是异步操作,而我们又需要异步操作的结果,那我们就需要使用回调函数来获取异步操作的结果。