繁体   English   中英

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

[英]How to use express.Router instance for error handling

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

由于路由器和应用程序实现了中间件接口,您可以像使用任何其他中间件功能一样使用它们。

这是我使用的一些通用错误处理:

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的最后一次调用

在其他 app.use() 和路由调用之后,您最后定义错误处理中间件;

我会说“路由”也存储路由器,因此您尝试执行的操作看起来不受支持。


进一步深入研究,我相信问题归结为路由器具有单独的层堆栈。 Express 在幕后实际上只是一个Router (我们这里看到这是设置的位置,然后再进一步向下将中间件委托给路由器)。 在内部,中间件功能表示为“图层”(如看到这里)来看,在构造函数中,我们可以看到路由器有自己的堆栈。

因此,请考虑以下示例:

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抛出错误,Router 将首先检查其自己的中间件堆栈以查找匹配的错误层(即(err, req, res, next)函数)并执行它,然后它会冒泡到应用程序水平并执行相同的操作。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM