中间件

业务处理的中间环节

中间件

中间件不分全局和局部

中间件本质就是一个 function函数

1
2
3
app.use('/api', (req, res, next)=>{
next();
});

next 函数

实现多个中间件连续调用的关键,可以将流转关系转交给下一个中间件或路由

1
next();

定义中间件函数

1
2
3
const mw = function(req, res, next) {
next();
}

多个中间件共享同一份 req 和 res

上游中间件挂载在 req 或 res 上的属性是可以被下游中间件调用的

定义多个中间件

1
2
3
app.get('/', [mw1, mw2], (req, res)=>{
console.log(req, res);
})
1
2
3
app.get('/', mw1, mw2, (req, res)=>{
console.log(req, res);
})

上面这两种写法是等价的

注意点

  • 中间件必须写在路由之前
  • 不要再 next() 后面写业务代码
  • 多个连续中间件中的 req对象和 res对象是共享的

中间件分类

  • 应用

绑定再 app实例上的中间件

  • 路由

绑定在 express.Router实例上的中间件

  • 错误

捕获项目中发生的异常错误,防止项目崩溃

1
function(err, req, res, next) {}
  • 内置

    • static:托管静态资源

    • json:解析 json格式请求体数据

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
        app.use(express.json())

      /* 获取传输的数据在 req.body */
      ````

      - urlencoded:解析RUL-encoded格式的请求体数据

      ```js
      app.use(express.urlencoded({extended: false}))

      /* 获取传输的数据在 req.body */
  • 第三方