中间件
官网:http://expressjs.com/en/guide/using-middleware.html
中间件本质就是一个请求处理方法。该方法接收三个参数:
- Request —— 请求对象
- Response —— 响应对象
- next —— 下一个中间件
中间件执行步骤:
- 当请求进来,会从第一个中间件开始进行匹配,如果匹配,则进来,如果请求进入中间件之后,没有调用 next 则代码会停在当前中间件。
- 如果调用了 next 则继续向后找到第一个匹配的中间件,如果不匹配则继续判断下一个中间件是否匹配,直到找到匹配的中间件并执行。所以 next 是一个方法,用来调用下一个中间件的,调用 next 方法也是要匹配的(不是调用紧挨着的那个)。
- 如果没有能匹配的中间件,则 Express 会默认输出:Cannot GET 路径
我们把用户从请求到响应的整个过程分发到多个中间件中去处理,这样做的目的是提高代码的灵活性,动态可扩展性。
应用程序级别中间件
是万能匹配,不关心请求路径和请求方法,也就是任何请求都会进入这个中间件。
app.use(function (req, res, next) {
console.log('Time:', Date.now())
next()
})
只要是以 /xxx/
开头的:
app.use('/xxx', function (req, res, next) {
console.log('Time:', Date.now())
next()
})
路由级别中间件
express.Router()
就是路由级别中间件
以下是常用的路由级别中间件:
get:
app.get('/', function (req, res, next) {
res.send('Hello World!')
next()
})
post:
app.post('/', function (req, res, next) {
res.send('Got a POST request')
})
put:
app.put('/user', function (req, res, next) {
res.send('Got a PUT request at /user')
})
delete:
app.delete('/user', function (req, res, next) {
res.send('Got a DELETE request at /user')
})
错误处理中间件
错误处理中间件方便用于进行统一错误处理。
错误处理中间件执行步骤:
- 当发生错误的时候,我们可以调用 next 传递错误对象
- 当调用 next 的时候,如果传递了参数,则直接往后找到带有四个参数的应用程序级别中间件,然后就会被全局错误处理中间件匹配到并处理之。
var express = require('express')
var fs = require('fs')
var app = express()
app.get('/', function (req, res, next) {
fs.readFile('.d/sa./d.sa/.dsa', function (err, data) {
if (err) {
// return res.status(500).send('Server Error')
next(err)
}
})
})
app.get('/a', function (req, res, next) {
fs.readFile('./abc', function (err, data) {
if (err) {
// return res.status(500).send('Server Error')
next(err)
}
})
})
app.use(function (req, res, next) {
res.send('404')
}) // => next(err) 不会进入这个方法
// 配置错误处理中间件,next(err) 将直接进入这个方法
app.use(function (err, req, res, next) {
res.status(500).send(err.message)
})
app.listen(3000, function () {
console.log('app is running at port 3000.')
})
内置中间件
具有某种特殊功能的中间件:
- express.static 提供静态资源,如html文件、img等。
- express.json 使用 json 有效负载解析传入请求。
- express.urlencode 使用 url 编码的有效负载分析传入请求。
网友评论