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
中的中间件将被点击。
经过一系列代码执行,我发现这里的代码不寻常:
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
中的中间件将被点击。