首页 > 解决方案 > 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 时脚本没有终止?

我的猜测是它类似于回调,因为返回的值被忽略,所以它发送响应,但忽略了脚本应该在那里结束的事实。

我该如何解决这个问题?

标签: javascriptnode.jsexpress

解决方案


.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 时脚本没有终止?

因为returnin 该语句只是从处理程序返回而.catch()不是从您的主函数返回,并且由于您已经完成 a.catch()并且没有在该 catch 处理程序中抛出或从处理程序返回一个被拒绝的承诺,所以父承诺因为已解决并在await继续后执行很好,然后会导致您遇到第二个res.send()问题,这会导致有关已发送标头的警告。


推荐阅读