node.js - 在 res.writeHead 之后 Express res.render 不工作
问题描述
我正在制作一个简单的网站,告诉用户他们访问该网站的次数。我还必须能够报告所有用户及其访问次数。我必须通过使用 cookie 来实现这一点,并且不能使用任何 NPM 模块。我的计划是使用 cookie 记录访问次数,并将其推送到 MongoDB,以便我可以报告所有用户。
我目前遇到了一个res.render
不适合我的问题。我正在尝试提供一个视图(哈巴狗)。谁能解释这是为什么?我收到错误:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
这是我的代码的简化版本。在完整版中,我有一些逻辑可以读取 cookie、incrementtimesSeen
和 displaytimesSeen
以供返回用户使用。
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()
,因为还会尝试写入标题,因此您会收到错误消息。如果你想在调用之前设置一个cookie ,那么在调用之前使用。而且,不要在已经结束 http 响应之后调用。res.render()
res.render()
res.render()
res.cookie()
res.render()
res.end()
res.render()
res.render()
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()
. 您必须始终发送对请求的响应,否则它只会在客户端和服务器中挂起一段时间,最终超时。
推荐阅读
- angular - 未通过 Angular PWA 的 Lighthouse 审核作为网站的子目录 - start_url 未获取
- linux - 在 grep 值应该并排而不是逐行出现之后
- python - 使用 numpy 数组字典的问题(索引错误)
- php - 正则表达式,匹配数字,然后是一系列字符
- javascript - 返回 NaN 的赋值运算符
- javascript - 如何将数字解析为文本
- c++ - 在 C++ 中使用 fread() 解释这个结果的原因是什么?
- mysql - Mysql ONLY_FULL_GROUP_BY 模式问题 - 为每个专辑选择单个图像 URL(任何)
- python - copying discrete events from one dataframe to another by comparing timestamps
- php - Dynamic routing in codeigniter