UnhandledPromiseRejectionWarning: не определено в Mongoose - PullRequest
0 голосов
/ 26 сентября 2018

При попытке аутентификации пользователей с Mongoose я получаю следующее предупреждение в своей консоли:

(node:20114) UnhandledPromiseRejectionWarning: undefined (node:20114) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:20114) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

Попытка отследить стек ничего не приводит, все, что я получаю, этоundefined.Подобные вопросы существуют здесь, на Stackoverflow, но они не относятся к моей ситуации.Любая идея, что это может вызвать?

Мой контроллер маршрута вызывает функцию findByCredentials внутри модели Mongoose:

Контроллер

static login(req, res) {
    User.findByCredentials(req.body.email, req.body.password)
      .then(user => {
        return user.generateAuthToken().then(token => {
          res.header("x-auth", token).json(user);
        });
      })
      .catch(error => {
        res.status(400).json({ message: "Invalid credentials." });
      });
  }

Модель

userSchema.statics.findByCredentials = function(email, password) {
  return this.findOne({ email }).then(user => {
    if (!user) {
      Promise.reject();
    }
    return new Promise((resolve, reject) => {
      bcrypt.compare(password, user.password, (err, res) => {
        res ? resolve(user) : reject();
      });
    });
  });
};

1 Ответ

0 голосов
/ 26 сентября 2018

Ошибка undefined исходит от вашего Promise.reject(), вы не передаете ему никакого сообщения об ошибке, поэтому вы буквально выбрасываете undefined.

Она не попадает в ловушку при входе в систему, потому что выне возвращаем его из вашего findByCredentials метода.

Решение:

userSchema.statics.findByCredentials = function(email, password) {
    return this.findOne({ email }).then(user => {
        if (!user) {
            return Promise.reject('User not available');
        }

        return new Promise((resolve, reject) => {
            bcrypt.compare(password, user.password, (err, res) => {
                res ? resolve(user) : reject();
            });
        });
    });
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...