一、 中间件概念
所谓中间件就是在收到请求后和发送响应之前的过程中执行的一系列函数。中间件接收(req, res, next)作为参数。
req和res分别为resquest和response,next()方法表示执行完当前中间件后进入下一个中间件。
中间件的主要行为:
- 执行任意代码
- 改变
request
和response
对象 - 结束请求-响应调用连
- 调用堆中的下一个中间件
如果当前中间件不会结束响应,则必须调用next()
进入下一个中间件,否则请求会被挂起(next(err)
除外)。
中间件使用示例
let express = require('express')
let app = express()
let requestTime = function (req, res, next) {
req.requestTime = new Date().toISOString();
String();
next()
}
app.use(requestTime) // requestTime 中间件在req中添加了requestTime的属性。
app.get('/', function (req, res) {
let responseText = 'Hello World!<br>'
responseText += '<small>Requested at: ' + req.requestTime + '</small>'
res.send(responseText)
})
app.listen(3000)
中间件的基本类型
- 应用级中间件
- 路由级中间件
- 错误处理中间件
- 内置中间件
- 第三方中间件
1.应用级中间件
示例:
var app = express()
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
app.get('/user/:id', function (req, res, next) {
res.send('USER')
})
注意: next('route')
可以跳过下一个路由中间件
。但是只在app.METHOD()
或者router.METHOD
中有效。
注意: next('router')
可以跳过剩余的路由中间件
。
2. 路由级中间件
示例代码
var app = express()
var router = express.Router()
// predicate the router with a check and bail out when needed
router.use(function (req, res, next) {
if (!req.headers['x-auth']) return next('router')
next()
})
router.get('/', function (req, res) {
res.send('hello, user!')
})
// use the router and 401 anything falling through
app.use('/admin', router, function (req, res) {
res.sendStatus(401)
})
3. 错误处理中间件
错误处理中间件有四个入参(err, req, res, next),有四个入参的就是错误处理中间件。
eg:
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
4. 内置中间件
Express的内置中间件函数
中间件函数 | 作用 |
---|---|
express.static | 可以用来处理网站里的静态文件的GET请求 |
express.json | parses incoming requests with JSON payloads. (Express 4.16.0+) |
express.urlencoded | parses incoming requests with URL-encoded payloads. ( Express 4.16.0+) |
5. 第三方中间件
npm install <第三方中间件>
Reference :