首页 > 解决方案 > UnhandledPromiseRejectionWarning:错误:在将标头发送到客户端后无法设置标头

问题描述

    router.get('/someendpoint/:someparam', async (request, response) =>{
    try{
        let theParams = request.params.someparam;
        let sentItem;
        
        if(theParams){
            let lastRecord = await someModel.find().sort({_id: -1}).limit(1); 
            
            for(let i of lastRecord){
             
                sentItem = i.itemNo;
            }
        }


        if(theParams !== sentItem){
            response.status(404).json({ErrorMessage: "Item was not issued before!"});
        }


        response.status(202).json({item: sentItem});

    }catch(error){
        response.status(400).json({ErrorMessage: error});
    }
 });

当我将一个参数传递给我知道数据库中不存在的“/someendpoint/:someparam”时,

我有以下代码来处理:

if(theParams !== sentItem){
    response.status(404).json({ErrorMessage: "Item was not issued before!"});
}

但是,我仍然收到以下错误:

(节点:23472)UnhandledPromiseRejectionWarning:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头

at ServerResponse.setHeader (_http_outgoing.js:518:11)
at ServerResponse.header 

(节点:23472)UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误源于在没有 catch 块的情况下抛出异步函数内部,或拒绝未使用 .catch() 处理的承诺。要在未处理的 Promise 拒绝时终止节点进程,请使用 CLI 标志--unhandled-rejections=strict(请参阅https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode)。(拒绝 ID:1)(节点:23472)[DEP0018] DeprecationWarning:不推荐使用未处理的承诺拒绝。将来,未处理的 Promise 拒绝将使用非零退出代码终止 Node.js 进程。

标签: javascriptnode.jsexpress

解决方案


这应该可以解决它,因为您正在尝试向客户端发送多个响应。您需要像下面这样添加 else 语句,或者在您的客户响应后添加一个 return。

router.get('/someendpoint/:someparam', async (request, response) => {
  try {
    let theParams = request.params.someparam
    let sentItem

    if (theParams) {
      let lastRecord = await someModel.find().sort({ _id: -1 }).limit(1)
      for (let i of lastRecord) {
        sentItem = i.itemNo
      }
    }

    if (theParams !== sentItem) {
      response.status(404).json({ ErrorMessage: 'Item was not issued before!' })
    } else {
      response.status(202).json({ item: sentItem })
    }
  } catch (error) {
    response.status(400).json({ ErrorMessage: error })
  }
})

或者保持原样,只需添加如下所示的返回

response.status(404).json({ ErrorMessage: 'Item was not issued before!' })
return

推荐阅读