Express中间件
2019-04-19
Express中间件
再怎么强调中间件在Express程序框架中的地位都不过分,可以说Express几乎就是由中间件搭建起来的服务应用。
官方文档中的Express中间件描述为:
Middleware functions are functions that have access to the request object (
req
), the response object (res
), and thenext
function in the application’s request-response cycle. Thenext
function is a function in the Express router which, when invoked, executes the middleware succeeding the current middleware.渣翻:
中间件是能够获取到Express应用请求-响应生命周期中
req
和res
对象,以及next
函数的函数。next
函数在Express路由中的作用是,当它被调用时,将请求处理从当前中间件移交给下一个中间件。
一个典型的Express应用中中间件位置如下:
var express = require('express');
var app = express();
//中间件1
app.get('/',function(req,res,next){
console.log('middleware1');
next();
})
//中间件2
app.get('/',function(req,res,next){
console.log('middleware2');
res.send('hello world.')
})
//中间件3
app.get('/',function(req,res,next){
console.log('middleware3');
res.send('This should not work.')
})
app.listen(3000);
- 定义中间件的方式是使用
app.VERB()
定义路由相关的中间件(又称路由处理器),VERB指HTTP谓词或者all()
,即处理所有的类型的HTTP请求;或者使用app.use()
定义不需要路由的全局中间件,比如静态文件服务,日志服务等等。 - 中间件通过路由的方式连接起来,通过调用
next()
进行传递。如果一个中间件里不调用next()
,意思就是请求处理中止,语义上应该返回一些东西(比如返回一个JSON,一个HTML或者什么的) - 中间件是在类似shell中“管道”里依次进行的,中间件的定义顺序有意义。比如,一般会在最后放一个“捕获一切”的终结中间件(即不调用
next()
的中间件),一般是返回404状态码的中间件。而如果将返回404的中间件放在最前面,则会造成服务全部返回404。
常用中间件
中间件除了让Express程序逻辑更加清晰,也提供了“开箱即用”的模块化功能。想要一个功能,如果有,就找出一个中间件,插入到中间件管道里,完事~
Express内置的中间件:
- express.static(root, [options]):静态文件服务中间件
- express.json([options]):JSON解析中间件
- express.urlencoded([options]):url编码中间件