如何解决在 res.writeHead 后 Express res.render 不起作用
我正在制作一个简单的网站,告诉用户他们访问了该网站的次数。我还必须能够报告所有用户及其访问次数。我必须通过使用 cookie 来实现这一点,并且不能使用任何 NPM 模块。我的计划是使用 cookie 来记录访问次数,并将其推送到 MongoDB,以便我可以向所有用户报告。
我目前遇到了 res.render
对我不起作用的问题。我正在尝试提供一个视图(哈巴狗)。谁能解释这是为什么?我收到错误消息:错误 [ERR_HTTP_HEADERS_SENT]:发送到客户端后无法设置标头
这是我的代码的简化版本。在完整版中,我有一些逻辑来读取 cookie、递增 timesSeen
并为返回的用户显示 timesSeen
。
router.get("/",function (req,res,next) {
// Create a new instance of a user and save to mongoDB
var newUser = new User();
newUser
.save()
.then((newUser) => {
// Once the user is saved,set the cookies to match
res.writeHead(200,{
"Set-Cookie": [
`userID=${newUser._id}`,"timesSeen=0",],});
res.render("index",{
title: "Express",userID: newUser._id,timesSeen: 0
});
res.end();
})
.catch((err) => {
if (err) {
console.log(err);
return;
}
});
}
解决方法
您不应该在同一个响应中调用 res.writeHead()
和 res.render()
,因为 res.render()
也会尝试写入标头,从而导致您收到错误消息。如果您想在调用 res.render()
之前设置 cookie,则在调用 res.cookie()
之前使用 res.render()
。并且,不要在 res.end()
之后调用 res.render()
,因为 res.render()
已经结束了 http 响应。
router.get("/",function (req,res,next) {
// Create a new instance of a user and save to mongoDB
var newUser = new User();
newUser
.save()
.then((newUser) => {
// Once the user is saved,set the cookies to match
res.cookie('userID',newUser._id);
res.cookie('timesSeen','0');
res.render("index",{
title: "Express",userID: newUser._id,timesSeen: 0
});
}).catch((err) => {
console.log(err);
res.sendStatus(500);
});
}
并且,始终在您的 .catch()
中发送错误响应。您必须始终对请求发送响应,否则它只会在客户端和服务器中停留一段时间,最终超时。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。