微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 res.writeHead 后 Express res.render 不起作用

如何解决在 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 举报,一经查实,本站将立刻删除。