nodejs的模块化、路由、函数API封装
模块化
模块职能要单一,不要乱写,划分模块的目的就是为了增强项目代码的可维护性,提升开发速率
自己编写的步骤
](https://i-blog.csdnimg.cn/blog_migrate/158044f7debe0ac9e7de6bff6f024016.png#pic_center)

app.js入门模块
职责:
- 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...');
})
router.js 路由模块
职责:
- 处理路由
- 根据不同的请求方法+请求路径设置具体的请求处理函数
路由设计

路由实现
//router.js文件
var fs = require('fs');
var Student = require('./student.js');
//专门用来包装路由的模块
var express = require('express');
//1.创建一个路由容器
var router = express.Router();
//2.把路由挂载到router路由器中
router.get('/students',function(req,res) {
//渲染学生列表页面
Student.find(function(err,students) {
if (err) {
return res.status(500).send('Server error')
}
res.render('index.html',{
fruits:[
'苹果',
'香蕉',
'橘子',
'樱桃'
],
students:students
})
})
})
//渲染添加学生页面
router.get('/students/new',function(req,res) {
res.render('new.html')
})
//处理添加学生
router.post('/students/new',function(req,res) {
//1.获取表单数据
// 2.处理
// 将数据保存到db.json文件中用以持久化
// 3.发送请求
// 先读取出来,转化为对象
// 然后往对象中push数据
// 然后把对象转化为字符串
// 然后把字符串再次写入文件
Student.save(req.body,function (err) {
if(err) {
return res.status(500).send('Server error')
}
res.redirect('/students');
})
})
//渲染编辑页面
// 1. 在客户端的列表页中处理链接问题(需要有 id 参数)
// 2. 获取要编辑的学生 id
// 3. 渲染编辑页面
// 根据 id 把学生信息查出来
// 使用模板引擎渲染页面
router.get('/students/edit',function(req,res) {
Student.findById(parseInt(req.query.id),function(err,student) {
if(err) {
return res.status(500).send('Server error');
}
res.render('edit.html',{
student:student
})
})
})
//处理编辑学生
// 1. 获取表单数据
// req.body
// 2. 更新
// Student.updateById()
// 3. 发送响应
router.post('/students/edit',function(req,res) {
Student.updateById(req.body,function(err) {
if(err) {
return res.status(500).send('Server error');
}
res.redirect('/students');
})
})
//处理删除学生
// 1. 获取要删除的 id
// 2. 根据 id 执行删除操作
// 3. 根据操作结果发送响应数据
router.get('/students/delete',function(req,res) {
Student.deleteById(req.query.id,function(err) {
if (err) {
return res.status(500).send('Server error');
}
res.redirect('/students');
})
})
//3.把router导出
module.exports = router;
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);
})
});
}
本文探讨了Node.js的模块化设计,强调模块职能的单一性以提高代码可维护性和开发效率。详细介绍了如何在app.js中创建服务、配置模板引擎、挂载路由以及提供静态资源服务。同时,讲解了router.js路由模块的职责,如何处理不同请求方法和路径的请求处理函数。此外,提到了数据操作文件模块student.js,专注于封装异步API来处理数据。
1391

被折叠的 条评论
为什么被折叠?



