Node.js-将标头发送到客户端后无法设置标头

时间:2019-03-13 20:13:01

标签: node.js mongodb express

我目前正在设计oauth登录系统,并且遇到了以下问题。我试图将用户登录并设置了会话数据后将其重定向回首页,但是res.redirect('/')会抛出NodeError: Cannot set headers after they are sent to the client。我似乎无法使其正常工作。下面是导致故障的代码:

      app.post(
    "/auth/openid/return",
    passport.authenticate("azuread-openidconnect", {
      failureRedirect: "/login"
    }),
    function(req, res) {
      let userProperties = req.user;
      new Promise((resolve, reject) => {
        MongoClient.connect(url, function(err, db) {
          if (err) next(err);
          let dbo = db.db("Lektier");
          let query = {
            oid: req.user.oid
          };
          dbo.collection("users").findOne(query, function(err, result) {
            db.close();
            if (result) {
              let type = result.type;
              resolve(type);
            }
          });
        });
      }).then(type => {
        req.session.regenerate(function() {
          req.session.user = userProperties.upn;
          if (type == "teacher") {
            req.session.teacheruser = userProperties.upn;
          }
          let names = userProperties.displayName.toString().split(" ");
          req.session.FirstName = names[0];
          req.session.LastName = names[1];
          res.redirect("/");
        });
      });
    }
  );

在此问题上的一些帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

每当您看到类似Cannot set headers after they are sent to the client的消息时,这意味着端点的逻辑试图向客户端发送响应并失败,因为它实际上已经响应了。 express的res.redirect()实际上会向客户端发送一些3xx http状态,如果您说此方法引发了您所面临的错误,则它已经发送了响应。

我没有发现任何可以响应您提供的代码片段的代码(除了res.redirect()之外),因此我建议您研究一下中间件。例如,在这里提到了护照认证。

相关问题