Проблема с ERR_HTTP_HEADERS_SENT и предупреждением об обещании - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть два предупреждения о коде ниже, и я не знаю, как решить эти проблемы.Первая проблема - предупреждение: Warning: a promise was created in a handler, а проблема - после того, как прокомментирована моя строка кода.

и ошибка звука:

Unhandled rejection Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client.Я прокомментировал код этой строкой

// Login Action
exports.login = (req, res) => {
  function getTodayDate() {
    const today = new Date();
    return today;
  }

  function getToken(userId) {
    const token = jwt.sign(
      {
        id: userId,
      },
      env.SECRET_KEY,
      {
        expiresIn: '60min',
      },
    );
    return token;
  }

  User.findOne({
    where: {
      login: req.body.login,
    },
  })
    .then(isUser => {
      if (isUser) {
        if (bcrypt.compareSync(req.body.password, isUser.password)) {
          User.update( // <- this is started my problem?
            {
              last_present_logged: getTodayDate(),
            },
            { where: { login: req.body.login } },
          ).then(() =>
            res.status(200).json({
              success: true,
              token: getToken(isUser.id),
            }),
          );
        }
        User.update(
          {
            last_failed_logged: getTodayDate(),
          },
          { where: { login: req.body.login } },
        ).then(() => {
          res.status(200).json({ // <- this is my red error!
            error: 'Auth failed. The password is incorrect.',
            success: false,
          });
        });
      } else {
        res
          .status(200)
          .json({ error: 'Auth failed. User does not exist', success: false });
      }
    })
    .catch(() => {
      /* just ignore */
    });
};

, как я могу решить эти проблемы?как я могу решить эти проблемы?

1 Ответ

0 голосов
/ 02 апреля 2019

Проблема в том, что вы заканчиваете запрос дважды, если bcrypt.compareSync() верно.Если вы сделаете это, вы получите Headers already sent

То, что вам нужно сделать, это либо return внутри if, либо обернуть следующую User.update внутри else

 User.findOne({
    where: {
      login: req.body.login,
    },
  })
    .then(isUser => {
      if (isUser) {
        if (bcrypt.compareSync(req.body.password, isUser.password)) {
          return User.update( // <- this is started my problem?
            {
              last_present_logged: getTodayDate(),
            },
            { where: { login: req.body.login } },
          ).then(() =>
            res.status(200).json({
              success: true,
              token: getToken(isUser.id),
            }),
          );
        }

        // Now this code won't be executed if `compareSync` is truthy.
        // Issue a return, so in case of failure, it goes to the .catch
        // avoiding UnhandledPromiseRejection warning
        return User.update(
          {
            last_failed_logged: getTodayDate(),
          },
          { where: { login: req.body.login } },
        ).then(() => {
          res.status(200).json({ // <- this is my red error!
            error: 'Auth failed. The password is incorrect.',
            success: false,
          });
        });
      } else {
        res
          .status(200)
          .json({ error: 'Auth failed. User does not exist', success: false });
      }
    })
    .catch(() => {
      /* just ignore */
      // Please, don't ignore, end the request here
      res.status(500).json({ error: 'Internal server error });
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...