【问题标题】:[NodeJS]: Cannot set headers after they are sent to the client[NodeJS]:将标头发送到客户端后无法设置标头
【发布时间】:2021-04-07 01:10:45
【问题描述】:

完整的概述和答案可以在第一个答案中找到: Error: Can't set headers after they are sent to the client

我正在使用:

  • 快递
  • 猫鼬(用于 MongoDB)

在注册新用户时,我想检查用户的电子邮件或姓名是否已经存在(因为它们必须是唯一的)。

我有这段代码:

    try {
  let user = await User.findOne({ email })

  if (user) {
    res
      .status(400)
      .json({ status: 'error', body: [{ msg: 'email already exist' }] })
  }

  user = await User.findOne({ name })

  if (user) {
    res
      .status(400)
      .json({ status: 'error', body: [{ msg: 'name already exist' }] })
  }

// ... some more code

} catch(err) {

//... code

}

我不断收到:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头。终端没有显示错误的确切位置。

【问题讨论】:

  • 您应该return res...,否则即使您已经尝试响应,该方法也会继续。
  • 感谢您的超级快速响应!我发布这个是为了自己编写解决方案(在浪费了一些时间之后意识到这一点......)以帮助他人。还是谢谢!

标签: node.js mongodb express http mongoose


【解决方案1】:

回复是res.status(400).json({ ... }),而不是return res.status(400).json({ ... })

因此,代码进入第二个条件并再次尝试发送响应,但 express 让我们知道响应已经发送并且无法再更改这些响应...

解决方案非常简单 - 添加 return 并确保此代码在尝试发送另一个响应之前停止。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,但有一个错字试图将 2 倍的响应发送到我的函数中。看来这也是你的情况。正如@David 所提到的,return 语句使函数退出......

    resp.send('OK')
    do_stuff
    resp.send('OK')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      • 1970-01-01
      • 2022-01-11
      • 2021-06-18
      • 2021-12-12
      • 2021-01-01
      相关资源
      最近更新 更多