我在NodeJS中使用Passport.js、Express和Mongoose时遇到了这个奇怪的问题。基本上,即使我只发送了一个头,我还是得到一个错误,说“不能在头被发送到客户端后设置它们”。
我读过其他帖子并尝试过,但没有一个有效。
我已经钻研过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 ”,这导致了它。刚加了退货声明就成功了!
使用ctrl F热键并查找所有“res”然后将关键字替换为“return res”,
change all 'res.' to 'return res.'
像这样:
改为 --
也许在某个块中有“res .”,比如if()语句
我收到这个错误是因为我的一个愚蠢的错误。当引用我的其他工作代码时,我需要更加小心。真正尴尬的是我花了多长时间试图找出错误的原因。Ouf!
坏的:
return res
.send(C.Status.OK)
.json({ item });
良好:
return res
.status(C.Status.OK)
.json({ item });
每当您尝试对同一请求发送多个响应时,就会发生该特定错误,通常是由不正确的异步代码引起的。
您在问题中显示的代码似乎不会导致该错误,但我确实在此处的不同路由中看到了会导致该错误的代码。
你有这个的地方:
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