首页 > 解决方案 > 在 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;
        }
      });
} 

标签: node.jsmongodbexpress

解决方案


您不应该在同一个响应中调用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(). 您必须始终发送对请求的响应,否则它只会在客户端和服务器中挂起一段时间,最终超时。


推荐阅读