当与Passport.js,Express和Mongoose一起使用时,我在NodeJS中遇到这个奇怪的问题。基本上,即使我发送的标题不止一个,我也会收到一条错误消息:“在将标题发送到客户端后无法设置标题”。

我读过其他文章并也尝试过,但没有一个起作用。

  • app.get - is there any difference between res.send vs return res.send
  • Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
  • Cannot set headers after they are sent to the client

  • 我已经解决了github问题,但似乎找不到解决方案。我遇到的问题是,当我发送多个响应 header 时会触发此错误,但事实是我没有发送多个 header 。似乎很奇怪。

    这是我的堆栈跟踪:



    这是我的服务器代码:
    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);
      })
    });
    

    我知道错误的含义,但是据我所知,我认为我没有发送多个 header ,我甚至通过console.log检查仅运行了一个块。

    提前非常感谢您! :)

    完整代码位于:https://github.com/lourdesr/devlog

    编辑:

    我想到了。尝试获取经过身份验证的用户时,这是我的password.js文件中的问题。我忘了在造成这种情况的“完成”方法上使用“返回”。刚刚添加了return语句就可以了!

    最佳答案

    每当您尝试向同一请求发送多个响应时,都会发生该特定错误,并且通常是由不正确的异步代码引起的。

    您在问题中显示的代码似乎不会导致该错误,但是我确实在不同的路由here中看到了会导致该错误的代码。

    您在哪里:

    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;
    }
    

    完成res.status(404).json({ errors });后,您不希望代码继续执行,因为它随后将尝试发送另一个响应。

    另外,到处都有:
    if (err) throw err;
    

    在异步回调中,您需要将其替换为实际发送错误响应的内容,例如:
    if (err) {
        console.log(err);
        res.sendStatus(500);
        return;
    }
    

    抛出一个异步回调只是返回到node.js事件系统,并没有抛出到任何您可以实际捕获的地方。此外,它不会发送对http请求的响应。换句话说,它实际上并没有执行服务器应该执行的操作。因此,请帮自己一个忙,不要在服务器中编写该代码。当您收到错误消息时,请发送错误响应。

    由于您似乎是新手,因此我想在https://github.com/lourdesr/devlog上包含指向完整源代码的链接,这是对您的称赞,因为仅通过查看,我就可以看到发生错误的位置。

    关于node.js - ERR_HTTP_HEADERS_SENT : Cannot set headers after they are sent to the client,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52122272/

    10-10 22:07