模块职能要单一,不要乱写,划分模块的目的就是为了增强项目代码的可维护性,提升开发速率
职责:
1.创建服务 做一些服务相关的配置模板引擎body-parer解析表单post请求体提供静态资源服务 2.挂载路由3.监听端口启动服务 //app.js文件 var express = require('express'); var bodyParser = require('body-Parser'); //配置body-parser //加载路由文件模块 var router = require('./router'); var app = express(); app.use('/node_modules/',express.static('./node_modules')); app.use('/public/',express.static('./public/')); //配置模板引擎和body-parser一定要在挂载路由之前 app.use(bodyParser.urlencoded( { extended : false })); app.use(bodyParser.json()); app.engine('html',require('express-art-template')); //挂载路由 app.use(router); // app.get('/',function(req,res) { // res.send('hello'); // }) app.listen(3000,function() { console.log('server is running...'); })职责:
处理路由根据不同的请求方法+请求路径设置具体的请求处理函数student.js 数据操作文件模块 职责:
操作文件中的数据,只处理数据,不关心业务这里才是我们学习 Node 的精华部分:奥义之所在 封装异步 API
//student.js文件 var fs = require('fs'); dbPath = './db.json'; exports.find = function (callback) { fs.readFile(dbPath,'utf8',function(err,data) { if(err) { return callback(err); } callback( null, JSON.parse(data).students); }) } exports.findById = function(id,callback) { fs.readFile(dbPath,'utf8',function(err,data) { if(err) { return callback(err); } var students = JSON.parse(data).students; //遍历数组的方法 find(),返回符合条件的对象 var ret = students.find(function(item) { //将传入的参数转化为整型 return item.id === parseInt(id); }) callback(null,ret); }) } exports.save = function(student, callback) { //第一个参数是对象数据,第二个是回调函数 fs.readFile(dbPath, 'utf8', function (err, data) { if (err) { return callback(err); } //将文件数据转化为对象 var students = JSON.parse(data).students; //处理id唯一,不重复 //最后的id➕1 student.id = students[students.length-1].id+1 //将用户传递的对象保存到数组中 students.push(student); //将对象数据转化为字符串 var fileData = JSON.stringify({ students:students }) //将转化后的字符串存放到文件中 fs.writeFile(dbPath, fileData, function(err) { if(err) { return callback(err); } //成功时错误对象为null callback(null); }) }) } exports.updateById = function(student,callback) { fs.readFile(dbPath, 'utf8',function(err,data) { if(err) { return callback(err); } //获取文件中的数据,并转化为对象 var students = JSON.parse(data).students; //遍历找出id一致的对象,即为需要更新数据的对象 var stu = students.find(function(item) { return item.id = parseInt(student.id); }) //遍历拷贝对象 for( var key in student) { stu[key] = student[key]; } //把对象数据转化为字符串 var fileData = JSON.stringify({ students:students }) fs.writeFile(dbPath,fileData,function(err) { if(err) { // 错误就是把错误对象传递给它 return callback(err); } // 成功就没错,所以错误对象是 null callback(null) }) }); } exports.deleteById = function(id,callback) { fs.readFile(dbPath,'utf8', function (err,data) { if(err) { return callback(err); } var students = JSON.parse(data).students; // findIndex 方法专门用来根据条件查找元素的下标 var deleteId = students.findIndex(function(item) { return item.id === parseInt(id); }) // 根据下标从数组中删除对应的学生对象 students.splice(deleteId,1); // 把对象数据转换为字符串 var fileData = JSON.stringify({ students:students }) // 把字符串保存到文件中 fs.writeFile(dbPath,fileData,function(err) { if(err) { return callback(err); } callback(null); }) }); }