Nodejs - невозможно установить заголовки после их отправки клиенту - PullRequest
0 голосов
/ 13 марта 2019

В настоящее время я проектирую систему входа в систему 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 голосов
/ 13 марта 2019

Всякий раз, когда вы видите сообщение, подобное этому Cannot set headers after they are sent to the client, это означает, что логика вашей конечной точки пыталась отправить ответ клиенту и терпела неудачу, потому что оно фактически уже ответило . res.redirect() Express на самом деле отправляет клиенту некое http-состояние 3xx, и, если вы говорите, что этот метод выдает ошибку, с которой вы столкнулись, что-то до того, как он уже отправил ответ.

Я не нашел ничего, что могло бы ответить в предоставленном вами фрагменте (кроме самого res.redirect ()), поэтому я предлагаю вам изучить ваше промежуточное ПО. Например, в паспортную аутентификацию, так как она упоминается здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...