express - 我*需要*在 Express.js 中使用 next(err) 吗?
问题描述
基本上,问题是遇到任何错误时我需要使用 next(err) 吗?nodejs 错误文档说可以使用标准的 if(err) else... 用于异步回调和 EventEmitters,只要错误不是用非异步等待函数的 try-catch 块处理的,因为会导致崩溃。如果我确实需要使用它们,如何防止在同一处理程序中多次调用 next() 函数以进行不同的异步操作?使用默认错误处理程序不会导致标头被多次发送并在使用事件发射器时导致其自身的错误?
如果有人问过这个问题,我很抱歉,只是我找不到为什么首选使用 express.js 错误处理的具体答案。
解决方案
如果您询问是否需要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');
});
请注意,中间件的顺序很重要,因此应该最后应用全局错误处理程序。
推荐阅读
- amazon-web-services - AWS 如何实现 getbucketlocation?
- angular - Angular:如何在打字稿文件中使用父组件的输入值
- python - 未等待的任务是否总是在通过 create_task 创建时启动?
- android - 如何在 React Native 中嵌套水平滚动视图?
- ruby - 在 Ruby 中返回方法
- linux - 将 find 和 md5sum 命令的结果保存到数组中以供进一步处理
- android - 资源 android:attr/android:progressBarStyle 未找到
- braintree - 如何在 Braintree 中获取托管字段值
- python - 如何让硒在单选按钮python上进行随机选择
- amazon-web-services - 访问 AWS 服务时如何处理 IAM 凭证轮换