Express4错误中间件序列

Express4 error middleware sequence

经过一系列代码执行,我发现这里的代码不寻常:

server.js

const Actions_Single_PVC = require('./routes/Actions_single_PVC.js');

app.use('/Actions_single_PVC', Actions_Single_PVC);

app.use((err, req, res, next) => {

    console.log('invalid token');

});

Actions_single_PVC.js

router.post('/', asyncMW(async (req, res, next) => {

throw new Error();

}));

router.use((err, req, res, next) => {
  console.log('error');
}

如果你以前从未见过这种结构,这里是 asyncMW:

const asyncMiddleware = fn =>
  (req, res, next) => {
    Promise.resolve(fn(req, res, next))
      .catch(next);
  };

  module.exports = asyncMiddleware;

我不明白的是,当抛出错误时(我在这里用throw new Error();重现了它)执行了server.js文件中的错误处理中间件。我预计 Actions_single_PVC.js 的错误处理中间件会被执行。

问题:

为什么执行server.js中的错误中间件,而不执行Actions_single_PVC.js中的错误中间件?

因为下面的代码只对基本路径匹配的请求应用中间件Actions_single_PVC

app.use('/Actions_single_PVC', Actions_Single_PVC);

而以下代码将中间件应用于所有全局请求。

app.use((err, req, res, next) => {

    console.log('invalid token');

});

如果您点击 url /Actions_single_PVC,那么 Actions_single_PVC 中的中间件将被点击。