gpt4 book ai didi

node.js - ERR_HTTP_HEADERS_SENT : Cannot set headers after they are sent to the client

转载 作者:搜寻专家 更新时间:2023-10-31 22:26:39 26 4
gpt4 key购买 nike

在与 Passport.js、Express 和 Mongoose 一起使用时,我在 NodeJS 中遇到了这个奇怪的问题。基本上,即使我发送的 header 不超过一个,我也会收到一条错误消息“在将 header 发送到客户端后无法设置 header ”。

我已经阅读了其他帖子并进行了尝试,但没有一个有效。

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

这是我的堆栈跟踪:

(node:9236) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

Server Running on port 5000
MongoDB Connected Error
[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
  at validateHeader (_http_outgoing.js:503:11)
   at ServerResponse.setHeader (_http_outgoing.js:510:3)
   at ServerResponse.header (/Users/lourdesroashan/code/github/devlog/node_modules/express/lib/response.js:767:10)
   at ServerResponse.json (/Users/lourdesroashan/code/github/devlog/node_modules/express/lib/response.js:264:10)
   at Profile.findOne.then.profile (/Users/lourdesroashan/code/github/devlog/routes/api/profile.js:27:30)
   at <anonymous>

这是我的服务器代码:

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);
})
});

我明白错误的含义,但据我所知,我不认为我发送了多个 header ,我什至通过 console.log 检查只有一个 block 在运行。

非常感谢您! :)

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

编辑:

我想通了。尝试获取经过身份验证的用户时,我的 passport.js 出现问题。我忘了在“完成”方法上使用“返回”,这导致了它。只需添加返回语句即可!

最佳答案

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

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

哪里有这个:

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;
}

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


此外,到处都有:

if (err) throw err;

在异步回调中,您需要将其替换为实际发送错误响应的内容,例如:

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

在异步回调中抛出只会返回到 node.js 事件系统,而不会抛出到您可以实际捕获它的任何地方。此外,它不会发送对 http 请求的响应。换句话说,它并没有真正执行服务器应该执行的操作。所以,帮自己一个忙,永远不要在服务器中编写该代码。当您遇到错误时,发送错误响应。


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

关于node.js - ERR_HTTP_HEADERS_SENT : Cannot set headers after they are sent to the client,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52122272/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com