1

出现了一系列代码执行,我发现这里不寻常的是代码:

服务器.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

4

1 回答 1

4

这是因为以下代码仅将中间件应用于具有基本路径匹配的请求Actions_single_PVC

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

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

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

    console.log('invalid token');

});

如果您点击该网址/Actions_single_PVC,则其中的中间件Actions_single_PVC将被点击。

于 2018-03-27T19:00:32.827 回答