javascript - Express.js 在 promise .catch() 错误中发送响应
问题描述
我有一个看起来像这样的函数:
function x(req, res, next){
await doSomething().catch(error =>{
return res.send('error here'})
}
await doSomethingElse().catch(error =>{console.log(error)})
return res.send('success');
}
当 doSomething() 返回错误时,我得到“无法在将标头发送到客户端后设置标头”,这是我理解的,但是为什么在我调用第一个 res.send 时脚本没有终止?
我的猜测是它类似于回调,因为返回的值被忽略,所以它发送响应,但忽略了脚本应该在那里结束的事实。
我该如何解决这个问题?
解决方案
.catch()
混音时控制流量变得非常复杂await
。我强烈建议一次只使用一个模型。使用 await,您可以执行以下操作:
async function x(req, res, next) {
try {
await doSomething();
await doSomethingElse();
res.send('success');
} catch(e) {
console.log(e);
res.send('error here'})
}
}
为什么当我调用第一个 res.send 时脚本没有终止?
因为return
in 该语句只是从处理程序返回而.catch()
不是从您的主函数返回,并且由于您已经完成 a.catch()
并且没有在该 catch 处理程序中抛出或从处理程序返回一个被拒绝的承诺,所以父承诺因为已解决并在await
继续后执行很好,然后会导致您遇到第二个res.send()
问题,这会导致有关已发送标头的警告。
推荐阅读
- javascript - 无法在 Angular 中读取 null 的属性“长度”
- vmware-clarity - 默认情况下如何使日期选择器浮动在输入框上方而不是下方
- c# - 如何检测网络摄像头上的按钮按下?
- android - 迁移到 android x 后的约束布局问题
- php - Phpspreadsheet COUNTIFS 公式未计算
- scala - 如何使用 Spark 2.1 将联合数据帧并行到一个数据帧
- python - 使用 Slack Python Webhook API 回复线程
- python - 如何使用数组模块创建字符串数组?
- python - 尝试在python中的数据框中显示超链接,其中数据框通过代码保存为html文件
- jenkins - Jenkins - 从不同节点中构建的上游作业复制工件