gpt4 book ai didi

javascript - 从 Await 调用中捕获错误后,如何停止在 Express.js 中执行?

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

我发现很多帖子几乎都回答了这个问题,但没有一个对我有用。

我有一个异步函数:

const doStuff = async (data)=>{
if(data == "a bug")
throw(new Error('Error! Bug found'));
return "not a bug";
}

我在路由处理程序上调用函数:

app.get('/doStuffRoute', async (req, res, next)=>{
const result = await doStuff("a bug")
.catch((err)=>{return next(err);});

console.log("This shouldn't execute!");
}

我的自定义错误中间件可以很好地处理错误,打印出错误等。但是我仍然看到 This shouldn't execute! 也被打印出来了!

根据我所有的研究和阅读,await X.catch(error) 应该try{ await X } catch {error}相同>。如果可能的话,我真的更喜欢 .catch();。有很多教程展示了这一点,甚至一些 stackoverflow 帖子也明确说明了这一点。然而,我偶尔也会发现一篇帖子神秘地说“不要将 await 与 .catch() 一起使用”,没有其他解释或细节,所以我不知道该怎么想。

我能找到的唯一提示是在你的 next(err) 调用之前添加 return 应该足以停止执行,但如果return next(err); 位于 .catch() block 内。

这是怎么回事?我的消息来源在撒谎吗?我误解了一些基本的基本概念吗?感谢任何让我走上正轨的帮助。

作为奖励问题,为什么这么多人建议使用包装函数 a-la express-async-handler ?为什么这与直接调用异步函数并处理它有任何不同的行为?

最佳答案

被拒绝的 promise 不会停止进一步的 Javascript 执行,所以这就是 .catch() 处理程序不会停止任何事情的原因。事实上,由于 async 函数是异步的,您的 console.log() 甚至会在 .catch() 处理程序执行之前执行。因此,您需要设计尊重 promise 状态的代码流。

我建议这样做:

app.get('/doStuffRoute', async (req, res, next) => {
try {
const result = await doStuff("a bug");
console.log("doStuff() resolved");
} catch(err) {
console.log("doStuff() rejected");
next(err);
}
}

这样,您就清楚地描绘了已解决 promise 和已拒绝 promise 的两个代码路径,您可以将代码放在适当的代码路径中。

关于javascript - 从 Await 调用中捕获错误后,如何停止在 Express.js 中执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66824242/

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