这是我参与8月更文挑战的第11天,活动详情查看:8月更文挑战
中间件
什么是中间件
对比自来水生产过程
d:/aaa/ABC.JPG: 截取文件后缀并转为小写 .jpg
上图中lastIndexOf、slice、toLowerCase几个方法就可以认为是中间件
中间件按顺序调用,对字符串 d:/aaa/ABC.JPG进行加工,得到最终的结果 Express是一种路由和中间件的Web框架,Express应用程序本质上是一系列中间件函数调用。
express中间件是一个特殊的url地址处理函数
- 该函数中有三个基本参数, req、res、next
- req就是回调函数中的req对象
- res就是回调函数中的res对象
- next:当该中间件执行完成后自动进入下一个中间件
自定义中间件
案例1: 记录日志中间件
目标: 每当浏览器输入地址访问时,就将当前访问的url和时间保存到 run.log 文件中
- 使用fs模块,在每一个路由中都调用appendFile方法将日志所需内容写入。
// 加载 fs 模块
const fs = require('fs')
app.get('/index',(req, res) => {
/**
参数1:要写的文件
参数2:要写的内容---字符串
参数3:可选,utf-8
参数4:回调函数
*/
const str = req.url + '' + new Date() + '\n'
fs.appendFile('./run.log', str ,(err) => {})
res.send('首页')
})
app.get('/list', (req, res) => {
const str = req.url + '' + new Date() + '\n'
fs.appendFile('./run.log', str, (err) => {})
res.send('列表页')
})
缺点: 很麻烦,每个路由中都要写两行代码
- 将写日志的代码封装为函数,在每个路由中都调用
app.get('/index',(req, res) => {
writeLog(req)
res.send('首页')
})
app.get('/list', (req, res) => {
writeLog(req)
res.send('列表页')
})
function writeLog (req) {
const str = req.url + '' + new Date() + '\n'
fs.appendFile('./run.log', str ,(err) => {})
}
缺点:依然麻烦,如果有50个路由,就要调用50次方法
- 将writeLog方法注册为中间件
① 将writeLog方法封装为中间件函数
function writeLog (req,res,next) {
const str = req.url + '' + new Date() + '\n'
fs.appendFile('./run.log', str ,(err) => {
if(err) {
// 出现错误时,进行提示,并结束程序
return res.send('写入失败日志')
}else{
// 未出现错误,进入下一个中间件来指行
}
})
}
② 在监听路由之前,先将writeLog 注册为中间件
③ 在每个路由中都将 writeLog 函数删除
// 将writeLog注册为中间件
app.use(writeLog)
app.get('/index', (req, res) => {
res.send('首页')
})
案例2: 自定义url检测中间件,不存在的url地址直接显示 404 not found
function checkUrl (req, res, next) {
if(res.url != '/index' && req.url !== '/list') {
return res.end('404 not found')
}
next()
}
注意调用顺序:
app.use(writeLog)
app.use(checkUrl)
先调用 writeLog 中间件时,不管url地址是否正确,都会记录 run.log 文件
先调用 checkUrl 中间件时,如果url地址不正确就不会写 run.log 文件
图例中间件工作原理
中间件类别
express有五中类别的中间件:
- 应用级别的中间件: 挂载到 app 上的中间件,例如:app.use()
- 路由级别的中间件: 挂载到 router 对象上的中间件,例如:router.get()、 router.post
- 错误级别的中间件: 回调函数中,有四个参数 app.use((err, req, res, next)=>{})
- 内置中间件: express.static() , express提供的唯一内置中间件
- 第三方中间件: 非express框架提供的,需要程序员手动安装才能使用的中间件;
body-parser
解析post 表单数据
一图解释MVC思想
- controller 控制器 处理业务
- model 数据模型 操作数据
- view 视图 页面渲染&json数据响应
- utils 工具
- public 静态资源
- app.js 程序入口
- router.js 定义路由规则
- middleware.js 自定义中间件
- config.js 配置项
- .gitignore git管理的时候忽略掉的文件或目录
以上目录和文件的命名 仅供参考 下篇讲node模块化 点赞支持、手留余香、与有荣焉,动动你发财的小手哟,感谢各位大佬能留下您的足迹。