重新认识nodejs之中间件

Posted by Shen Chaoran on October 11, 2017

如果把一个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 框架的,在新版中全部单独作为一个模块分离了出来。

connect middleware

常用的中间件有:

  • 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

第三方中间件