Express应用程序本质上是一系列中间件函数调用。
中间件可以做下面这些事情
- 执行任何代码
- 修改request和response对象
- 结束请求(响应周期)
- 调用堆栈中的下一个中间件函数
- 如果当前中间件没有结束请求,那么需要调用next(),将控制权传递给下一个中间件函数,否则请求会被挂起,后边定义的中间件将不会执行
app.use(function (req, res, next) {
console.log('first')
// next()
})
app.post('/info', (req, res) => {
console.log('****POST*****')
console.log(req.body)
res.status(200).send(req.body)
})
使用postman模拟请求http://localhost:3002/info,请求会在第一个中间件挂起,不会执行到第二个
有next
没有next
express将中间件等信息存放在stack中,如果没有匹配到合适的中间件或者没有结束请求,那么就会循环往下匹配,直到最后一个。
express可以使用下面这些类型的中间件:
- Application-level
- Router-level
- Built-in 内置中间件
- Error-handling错误处理中间件
- Third-party第三方中间件
Application-level 中间件
使用app.use()和app.METHOD()将中间件绑定到app对象。METHOD为get,put、post等
执行匹配任何路径(这里省略/)
app.use(function(req,res,next)=>{
//do something
})
执行匹配/user路径的任何http请求
app.use('/user',(req,res,next)=>{
//do something
})
执行匹配/user/:id路径的get请求
app.get('/user/:id',(req,res,next)=>{
//do something
})
Router-level 中间件
和Application-level工作方式类似,但是它是绑定在express.Router()上的
Error-handling 中间件
定义方法差不多,只是它接收四个参数,使用相关方法如下
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
var port = '3002'
app.use(bodyParser.json())
app.use(function (req, res, next) {
console.log('first')
next()
})
app.post('/info', (req, res) => {
console.log('****POST*****')
console.log(req.body)
throw new Error('测试')
// res.status(200).send(req.body)
})
app.use(function (err, req, res, next) {
console.error(err)
res.status(500).send(err.message)
})
app.listen(port, () => {
console.log(`localhost:${port}`)
})
内置中间件
包含在express中的中间件功能
内置的中间件有:
- express.static提供静态资源
// 将静态文件目录设置为项目根目录+/public
app.use(express.static(__dirname + '/public'));
- express.json使用JSON解析传入的请求(express 4.16.0+有效)
- 类似body-parse中的bodyParse.json()
app.use(express.json())
- express.urlencoded使用URL-encoded解析传入的请求(express 4.16.0+有效)
- 类似body-parse中bodyParser.urlencoded()
app.use(express.urlencoded({extended:false}))
第三方中间件
需要安装模块获取需要的功能,然后在application level或者router level中加载到应用程序中,例如下面的增加body-parser
var express = require('express')
var bodyParser = require('body-parser')
var app = express()
app.use(bodyParser.json())
中间件next源码解析链接 https://www.cnblogs.com/aishangliming/p/6115359.html