与 Passport.js、Express 和 Mongoose 一起使用时,我在 NodeJS 中遇到了这个奇怪的问题。基本上,即使我不发送多个标头,我也会收到一条错误消息,提示“在将标头发送到客户端后无法设置标头”。
我已经阅读了其他帖子并尝试了它们,但它们都没有奏效。
- app.get - res.send 与 return res.send 之间有什么区别吗
- 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
- 发送到客户端后无法设置标头
我已经挖掘了 github 问题,但似乎找不到解决方案。我收到的问题是,当我发送多个响应标头时会触发此错误,但事实是我没有发送多个标头。这似乎很奇怪。
这是我的堆栈跟踪:
(node:9236) DeprecationWarning:当前的 URL 字符串解析器已被弃用,并将在未来的版本中删除。要使用新的解析器,请将选项 { useNewUrlParser: true } 传递给 MongoClient.connect。
服务器在 5000 端口上运行
MongoDB 连接错误
[ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头
在 validateHeader (_http_outgoing.js:503:11)
在 ServerResponse.setHeader (_http_outgoing.js:510:3)
在 ServerResponse.header (/Users/lourdesroashan/code/github/devlog/node_modules/express/lib/response.js:767:10)
在 ServerResponse.json (/Users/lourdesroashan/code/github/devlog/node_modules/express/lib/response.js:264:10)
在 Profile.findOne.then.profile (/Users/lourdesroashan/code/github/devlog/routes/api/profile.js:27:30)
在 <匿名>
这是我的服务器代码:
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);
})
});
我理解错误的含义,但据我所知,我认为我没有发送多个标头,我什至通过 console.log 检查了只有一个块在运行。
非常感谢您! :)
完整代码位于: https ://github.com/lourdesr/devlog
编辑:
我想到了。在尝试获取经过身份验证的用户时,这是我的 passport.js 中的一个问题。我忘记在导致它的“完成”方法上使用“返回”。刚刚添加了 return 语句,它就起作用了!
原文由 lourdesr 发布,翻译遵循 CC BY-SA 4.0 许可协议
每当您尝试向同一请求发送多个响应时就会发生该特定错误,并且通常是由不正确的异步代码引起的。
您在问题中显示的代码似乎不会导致该错误,但我确实在 此处 看到不同路径的代码会导致该错误。
你在哪里有这个:
您需要将其更改为:
您不希望代码在完成后继续
res.status(404).json({ errors });
因为它会尝试发送另一个响应。此外,到处都有:
在异步回调中,您需要将其替换为实际发送错误响应的内容,例如:
将异步回调抛入内部只会返回到 node.js 事件系统,而不会抛出到您可以实际捕获它的任何地方。此外,它不会发送对 http 请求的响应。换句话说,它并没有真正执行服务器应该执行的操作。所以,帮自己一个忙,永远不要在服务器中编写该代码。当您遇到错误时,发送错误响应。
因为看起来你可能是新来的,所以我想称赞你在 https://github.com/lourdesr/devlog 上包含一个指向你的完整源代码的链接,因为只有通过查看我才能看到这个发生错误的地方。