Express «UnhandledPromiseRejectionWarning: RangeError» в промежуточном программном обеспечении входа - PullRequest
0 голосов
/ 22 января 2020

Я делаю RESTful API для интерфейса vuejs с аутентификацией и сохранением данных по учетной записи.

Я получаю эту ошибку при попытке войти в систему пользователя. По сути, мой интерфейс отправит запрос с тело, содержащее имя пользователя и пароль.

Вот журнал промежуточного программного обеспечения в express:

exports.post_LogIn = (req, res, next) => {
  User.findOne({ username: req.body.username })
    .then(foundUser => {
      if (!foundUser) {
        console.log("no user");
        const error = new Error("No user with that username");
        error.statusCode = 400;
        error.tosend = "No user with that username";
        throw error;
      } else {
        return bcrypt.compare(req.body.password, foundUser.password);
      }
    })
    .then(isEqual => {
      if (!isEqual) {
        console.log("wrong password");
        const error = new Error("Passwords don't match");
        error.statusCode = 400;
        error.tosend = "Passwords don't match";
        throw error;
      }
      console.log("logged in");
      const token = jwt.sign(
        {
          username: foundUser.username
        },
        "secretpassword",
        { expiresIn: "24h" }
      );
      console.log(token);
      res.status(200).json({ username: foundUser.username });
    })
    .catch(err => {
      res.status(err.statusCode).json({ message: err.tosend });
    });
};

Так что в основном, когда есть проблема с учетными данными (либо неправильное имя пользователя или пароль), я хочу отправить ответ клиенту с сообщением о том, что не так, и пусть клиент справится с этим. Это работает просто отлично и, как и ожидалось.

Однако, когда я отправляю действительные учетные данные, мой оператор console.log проходит, но часть токена и ответа выдает мне эту ошибку

(узел : 14515) UnhandledPromiseRejectionWarning: RangeError [ERR_HTTP_INVALID_STATUS_CODE]: недопустимый код состояния: не определено в ServerResponse.writeHead (_http_server. js: 242: 11) в ServerResponse._implicit_h_t_ht_0: js: 579: 9) в ServerResponse.end (_http_outgoing. js: 689: 5) в ServerResponse.send (/home/martin/dev/projets/trader-backend/node_modules/express/lib/response.js: 221: 10) в ServerResponse. json (/home/martin/dev/projets/trader-backend/node_modules/express/lib/response.js:267:15) в / home / martin / dev /projets/trader-backend/controllers/UserController.js:97:34 (узел: 14515) UnhandledPromiseRejectionWarning: необработанное отклонение обещания. Эта ошибка возникла либо из-за того, что внутри асинхронной функции возникла ошибка без блока catch, либо из-за отклонения обещания, которое не было обработано с помощью .catch (). (идентификатор отклонения: 1) (узел: 14515) [DEP0018] Предупреждение об устаревании: отклонения необработанного обещания устарели. В будущем отклонения обещания, которые не обрабатываются, завершат процесс Node.js с ненулевым кодом завершения.

Я попытался закомментировать часть токена или комментировать ответ и консоль, записывающую журнал. токен, и я все еще получаю ту же ошибку.

Однако, если я закомментирую токен и использую res.send вместо res. json, он, кажется, работает нормально, и мой интерфейс получает ответ.

Есть идеи, что может быть причиной этого? Я как бы потерялся здесь

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