当前位置: 首页 > 知识库问答 >
问题:

ERR_HTTP_HEADERS_SENT:将标头发送到客户端后,无法设置标头

卫财
2023-03-14

我在NodeJS中使用Passport.js、Express和Mongoose时遇到了这个奇怪的问题。基本上,即使我只发送了一个头,我还是得到一个错误,说“不能在头被发送到客户端后设置它们”。

我读过其他帖子并尝试过,但没有一个有效。

  • 应用程序。get-res.send与return res.send
  • 之间有什么区别吗
  • 错误[ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后,无法设置标头
  • 发送到客户端后无法设置标头

我已经钻研过github问题,但似乎找不到解决方案。我发现当我发送多个响应头时会触发此错误,但事实是我没有发送多个头。这看起来很奇怪。

这是我的堆栈跟踪:

(节点:9236)弃用警告:当前URL字符串分析器已弃用,将在未来版本中删除。要使用新的解析器,请将选项{useNewUrlParser:true}传递给MongoClient.connect。

服务器在端口 5000 上运行
MongoDB 连接错误
[ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端
后无法设置标头

这是我的服务器代码:

router.get("/userprofile", passport.authenticate('jwt', { session: false }), (req, res) => {

  Profile.findOne({ user: req.user.id }).then(profile => {
    if (!profile) {
      return res.status(404).json({ error: "No Profile Found" });
    }
    else {
      res.json(profile);
    }
  }).catch(err => {
    console.log(err);
  })
});

我明白这个错误意味着什么,但据我所知,我认为我没有发送多个标头,我甚至通过控制台进行了检查。记录只运行了其中一个块。

提前谢谢大家了!:)

完整代码在:https://github.com/lourdesr/devlog

编辑:

我想通了。这是我的passport.js在试图获取认证用户时出现的问题。我忘了在“done”方法上使用“return ”,这导致了它。刚加了退货声明就成功了!

共有3个答案

公孙和怡
2023-03-14

使用ctrl F热键并查找所有“res”然后将关键字替换为“return res”,

change  all 'res.' to  'return res.'

像这样:

改为 --

也许在某个块中有“res .”,比如if()语句

徐翔
2023-03-14

我收到这个错误是因为我的一个愚蠢的错误。当引用我的其他工作代码时,我需要更加小心。真正尴尬的是我花了多长时间试图找出错误的原因。Ouf!

坏的:

return res
  .send(C.Status.OK)
  .json({ item });

良好:

return res
  .status(C.Status.OK)
  .json({ item });
姬昀
2023-03-14

每当您尝试对同一请求发送多个响应时,就会发生该特定错误,通常是由不正确的异步代码引起的。

您在问题中显示的代码似乎不会导致该错误,但我确实在此处的不同路由中看到了会导致该错误的代码。

你有这个的地方:

if (!user) {
  errors.email = "User not found";
  res.status(404).json({ errors });
}

您需要将其更改为:

if (!user) {
  errors.email = "User not found";
  res.status(404).json({ errors });
  // stop further execution in this callback
  return;
}

完成< code>res.status(404)后,您不希望代码继续运行。JSON({ errors });因为它将尝试发送另一个响应。

此外,到处都有这个:

if (err) throw err;

在异步回调中,您需要用实际发送错误响应的内容来替换它,比如:

if (err) {
    console.log(err);
    res.sendStatus(500);
    return;
}

在异步回调中抛出只会返回到节点。js事件系统,并且不会被抛出到任何您可以实际捕获它的地方。此外,它不会向http请求发送响应。换句话说,它并没有真正做到服务器应该做的事情。因此,请帮自己一个忙,不要在服务器上编写代码。当您收到错误时,发送错误响应。

由于看起来您可能是新来的,因此我想称赞您在 https://github.com/lourdesr/devlog 中提供了指向完整源代码的链接,因为只有通过查看它,我才能看到发生错误的地方。

 类似资料:
  • 所以我看到了一篇很棒的帖子“错误:发送到客户端后无法设置标题,但仍然不明白我的“标题”部分有什么问题,因为当我将它从注释掉的

  • 问题内容: 将标头发送到客户端后,无法设置标头。这是请求验证后的后端错误,看起来像标头问题。我为我的项目脏代码感到抱歉,我还需要做其他事情,因此在注释中有一些代码。这是我的代码 您可以在我的代码中发现其他错误,因为我尝试了许多不同的方法。这是passport.js配置文件 这是身份验证的ajax请求 非常感谢你。 问题答案: 这是由于您的代码试图从authenticate函数发送多个响应。 删除其

  • 将标头发送到客户端后,无法对其进行设置。这是我的身份验证post请求后的后端错误。看起来标题有问题。我很抱歉我的项目肮脏的代码,我需要做一些别的事情,所以有一些代码在评论中。这是我的代码 你可以在我的代码中找到其他错误,因为我尝试了许多不同的方法。以下是passport.js配置文件 这是用于身份验证的 ajax 请求 非常感谢。

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向到http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 问题内容: 我对Node.js相当陌生,遇到了一些问题。 我正在使用Node.js 4.10和Express 2.4.3。 当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将重定向至http://127.0.0.1:8888/auth/facebook_callback。 然后,我收到以下错误: 以下是我的代码: 我可以知道我的代码有什么问题吗? 问题答案:

  • 我正在关注一个关于udemy上的节点.js的课程,这有点过时了,遇到了这些错误,我无法找到解决方案。 我尝试了什么: 使用next(); 在所有if语句中添加返回res 有人能帮我修一下这些吗?我将不胜感激! 提前感谢! 用户名存在错误:错误 [ERR_HTTP_HEADERS_SENT]:在服务器响应.set 上将标头发送到客户端后无法设置标头 (_http_outgoing.js:526:11