如果把一个http处理过程比作是污水处理,中间件就像是一层层的过滤网。每个中间件在http处理过程中通过改写 request 和 response 的数据、状态,实现了特定的功能。
中间件(Middleware) 是一个函数,它可以访问请求对象(req),响应对象(res),和 web 应用中处于请求-响应循环流程中的中间件,一般被命名为 next 的变量。中间件的函数参数形式是:(req, res, next) => {}
中间件的功能:
- 执行任何代码。
- 修改请求和响应对象。
- 终结请求-响应循环。
- 调用堆栈中的下一个中间件。
如果当前中间件没有终结请求-响应循环,则必须调用 next() 方法将控制权交给下一个中间件,否则请求就会挂起。next() 的调用方式有三种:
- next(routeUrl): 由下一个路由捕捉
- next(error): 由错误处理中间件捕捉
- next(): 交给下一个中间件
应用级中间件
- app.use(middleware)
- app.use(middlewareA, middlewareB, middlewareC)
- app.use(‘url’, middleware)
- app.get(‘url’, middleware)
路由级中间件
- router.use(middleware)
- router.use(‘url’, middleware)
- router.get(‘url’, middleware)
错误处理中间件
错误处理中间件和其他中间件定义类似,只是必须要使用 4 个参数:(err, req, res, next) => {}
其他中间件
原本有很多中间件放在 connect
框架中,express 框架基本上就是基于 connect 框架的,在新版中全部单独作为一个模块分离了出来。
常用的中间件有:
- cookieParser
- session: 一般在配置中包括了数据库的表名和主键名,会自动根据 sessionId 查询 session 对象,可以在 req.session 中拿到这个对象。
- cookieSession: cookie-based-session,即整个session保存在cookie中,而不是仅保存sessionId,这种方案只在session比较小时可用。
- bodyParser.json()
- bodyParser.urlencoded()
- bodyParser.multipart(): multipart/form-data 解析中间件
- compression: gzip 压缩中间件
- logger: 请求日志中间件
- CSRF: CSRF保护中间件,通过 req.csrfToken() 令牌函数绑定到请求的表单字段。token 存储在 session 中,同时通过后台模板引擎渲染到页面的隐藏表单域中,在收到请求时和session中的值相对比。
- favicon: logo
- limit: 请求大小限制中间件
- query: url解析中间件,将 url 参数挂到 req.query 对象中。
- express.static(path): 静态资源中间件
- responseTime: 计算响应时间
- app.all(‘*’, (req, res, next) => {}): 拦截器;开启CORS
第三方中间件