中间件是express的一大特色,一个express应用就是由众多的中间件来完成。中间件其实就是函数。
一个简单的例子:
app.use(function (req,res,next) {
console.log('time ' + Date.now())
next()
})
从上面这个函数来看,中间件接受三个参数:
req – 请求对象
res – 响应对象
next – 下一个要被调用的中间件
Express 对中间件的分类:
- 应用程序级中间件
// 1.不关心请求路径和请求方法的中间件(如上实例代码)
// 2.关心路径,不关心请求方法
app.use('/',function (req,res) {
console.log(req.method)
res.send('index.js')
})
// 3.关心请求路径及方法
app.get()
app.post()
...
说明:当请求进来,会从第一个中间件开始进行匹配
如果匹配,则进来,如果请求进入中间件之后,没有调用 next 则代码会停在当前中间件,如果调用了 next 则继续向后找到第一个匹配的中间件;如果不匹配,则继续判断匹配下一个中间件 。
当一个请求进入一个中间件之后,如果不调用 next 则会停留在当前中间件。所以 next 是一个方法,用来调用下一个中间件的,注意调用 next 方法也是要匹配的(不是调用紧挨着的那个)
- 路由器级中间件
工作方式与应用程序及中间件相同,但它绑定到的是一个实例express.Router()。我们使用router.use()和router.METHOD()函数加载路由器级中间件。
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)
})
- 错误处理中间件
app.use(function (err, req, res, next) {
console.error(err.stack)
res.status(500).send('Something broke!')
})
- 内置中间件
express.static提供静态资源,如HTML文件,图像等。
express.json使用JSON有效负载解析传入的请求。注意:适用于Express 4.16.0+
express.urlencoded用URL编码的有效负载解析传入的请求。注意:适用于Express 4.16.0+
- 第三方中间件
如: express-session等