gpt4 book ai didi

javascript - 如何使用 express.Router 实例进行错误处理

转载 作者:行者123 更新时间:2023-12-03 07:05:12 25 4
gpt4 key购买 nike

根据documentation ,任何 nodejs express 中间件功能都可以替换为 App 或 Router 实例:

Since router and app implement the middleware interface, you can use them as you would any other middleware function.



这是我使用的一些通用错误处理:
express()
.use('/test', new TestRouter())
.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send(err.message);
})
.listen(PORT);

我试图用错误处理路由器替换我的错误处理,但现在回调永远不会执行,并且 express 使用它的默认错误处理。
const handler = new express.Router();
handler.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send(err.message);
});

express()
.use('/test', new TestRouter())
.use(handler)
.listen(PORT);

为什么这不能按预期工作,我该如何解决?

最佳答案

错误处理程序需要配置为对 use 的最后调用。 ,根据 docs

You define error-handling middleware last, after other app.use() and routes calls;



我会说“路由”也会存储路由器,因此您尝试做的事情看起来不受支持。

进一步深入研究,我认为问题归结于路由器具有单独的层堆栈这一事实。 Express 在幕后实际上只是一个 Router (我们看到 here 这是设置的位置,然后再往下看中间件是 delegated 到路由器的位置)。在内部,中间件函数表示为“层”(如 here 所示)并查看 constructor ,我们可以看到路由器有自己的堆栈。

所以考虑下面的例子:
express()
.use(new RouterA())
.use(new RouterB())
.use((err, req, res, next) => {
...
})
.listen(PORT);

通过查看源代码,可以将其视为:
express()
.use((req, res, next) => {
router.handle(req, res, next);
})
.use((req, res, next) => {
router.handle(req, res, next);
})
.use((err, req, res, next) => {
...
});

因此,如果在 RouterA 中抛出错误, ,路由器首先会检查它自己的中间件堆栈是否有匹配的错误层(即 (err, req, res, next) 函数)并执行它,然后它会冒泡到应用程序级别并执行相同的操作。

因此,鉴于您的示例,如果您考虑翻译后的代码,这就解释了为什么它不会在第二个路由器中捕获您的错误处理程序 - 路由器签名与错误处理程序的签名不匹配,因此它将被跳过。

关于javascript - 如何使用 express.Router 实例进行错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59814803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com