首页 > 解决方案 > 我*需要*在 Express.js 中使用 next(err) 吗?

问题描述

基本上,问题是遇到任何错误时我需要使用 next(err) 吗?nodejs 错误文档说可以使用标准的 if(err) else... 用于异步回调和 EventEmitters,只要错误不是用非异步等待函数的 try-catch 块处理的,因为会导致崩溃。如果我确实需要使用它们,如何防止在同一处理程序中多次调用 next() 函数以进行不同的异步操作?使用默认错误处理程序不会导致标头被多次发送并在使用事件发射器时导致其自身的错误?

如果有人问过这个问题,我很抱歉,只是我找不到为什么首选使用 express.js 错误处理的具体答案。

标签: expressnodejs-server

解决方案


如果您询问是否需要next(err)在处理程序中使用显式,例如

app.get('/someurl', (req, res, next) => {
   //do something - whoops had an error
   next(err);
})

不,处理程序不需要上述内容。唯一需要显式包装或传递错误的情况是,例如,如果您使用了 atry/catch并且没有在处理程序中处理错误条件本身,即没有在处理程序中返回响应(不知道为什么要想这样做)。

当处理程序中发生错误时,上面会发生什么,express将一直持续middlewares到它找到一个处理您的错误的处理程序。如果没有,它将退出。

因此,要使用全局错误处理程序,您可以像下面这样编写您的应用程序,而不必担心next(err)每个处理程序函数。

app.get('/route/one', async (req, res) => {
   // do something that could throw an error
   const result = await aFunctionThatCouldThrowAnError();
   // No error handling in this function
   res.json({ result });
});

app.get('/route/two', (req, res) => {
   res.json({ hello: 'world-two' });
});

// A Global Error handler
app.use((err, req, res, next) => {
    //handle all errors here
    if(err) {
       res.status(500).send('some error message')
    }
    res.status(404).send('not found');
});

请注意,中间件的顺序很重要,因此应该最后应用全局错误处理程序。


推荐阅读