gpt4 book ai didi

javascript - 在 Async Await 函数中抛出错误后停止执行代码

转载 作者:行者123 更新时间:2023-11-30 14:05:59 28 4
gpt4 key购买 nike

我正在创建一个基于 Nodejs 和 express 的后端应用程序,并尝试以适合生产系统的方式处理错误。

我使用 async await 来处理代码中的所有同步操作。

这是路由器端点的代码片段

app.get("/demo",async (req, res, next) => {
await helper().catch(e => return next(e))
console.log("After helper is called")
res.json(1)
})

function helper(){ //helper function that throws an exception
return new Promise((resolve, reject)=> reject(new Error("Demo Error")))
}

在定义所有路由后,我添加了一个通用错误处理程序来捕获异常。为了简化它,我添加了一个简单的函数

routes.use( (err, req, res, next) => {
console.log("missed all", err)

return res.status(500).json({error:err.name, message: err.message});
});

我希望 await helper() 之后的代码不应该执行,因为异常已经被处理并且响应被发送到前端。相反,我得到的是这个错误。

After helper is called
(node:46) UnhandledPromiseRejectionWarning: Error
[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the
client

使用 async await 处理错误的正确方法是什么?

最佳答案

您得到After helper is called,因为您的代码继续执行,因为它没有返回

不要将 catchasync/await 链接在一起。您可以使用 Promise 来做到这一点。

helper()
.then(data => console.log(data))
.catch(e => console.log(e))

您可以像这样处理错误:

app.get("/demo",async (req, res, next) => {
try {
await helper();
// respond sent if all went well
res.json(something)
catch(e) {
// don't need to respond as you're doing that with catch all error handler
next(e)
}
})

关于javascript - 在 Async Await 函数中抛出错误后停止执行代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55378850/

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