Как добавить оператор catch, чтобы исправить предупреждение об отклонении необработанного обещания - PullRequest
0 голосов
/ 03 апреля 2019

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

Я пытался добавить .catch(err => console.log(err)); и .catch(console.log("Something's gone wrong.")); до конца .findOne().then() и .compare().then(), но это не помогло.

router.post("/login", (req, res) => {
  const email = req.body.email;
  const password = req.body.passowrd;

  User.findOne({ email }).then(user => {
    if (!user) {
      return res.status(404).json({ email: "User not found" });
    }

    bcrypt.compare(password, user.passowrd).then(isMatch => {
      if (isMatch) {
        res.json({ msg: "Success" });
      } else {
        return res.status(400).json({ password: "Password incorrect" });
      }
    });
  });
});

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

(node:18152) UnhandledPromiseRejectionWarning: Error: Illegal arguments: undefined, undefined
    at _async (/home/jok/code/node_modules/bcryptjs/dist/bcrypt.js:286:46)
    at /home/jok/code/node_modules/bcryptjs/dist/bcrypt.js:307:17
    at new Promise (<anonymous>)
    at Object.bcrypt.compare (/home/jok/code/node_modules/bcryptjs/dist/bcrypt.js:306:20)
    at User.findOne.then.user (/home/jok/code/routes/api/users.js:64:12)
    at processTicksAndRejections (internal/process/next_tick.js:81:5)
(node:18152) 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:18152) [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.

Ответы [ 2 ]

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

bcrypt.compare(myPlaintextPassword, hash, function(err, res) {
    if (err) {
      console.log(err);
    }
    
    // Use your response
});

Нет необходимости использовать обещания в простой логике.

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

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 100 * * происходит потому, что вы не обрабатываете отклонение Обещания, то есть отсутствует обработчик .catch.

bcrypt.compare(password, user.passowrd).then(isMatch => {
  if (isMatch) {
    res.json({ msg: "Success" });
  } else {
    return res.status(400).json({ password: "Password incorrect" });
  }
})
.catch(err => {
    res.status(500).send('Internal server error');
});

В данном конкретном случае кажется, что password & user.passowrd равны undefined. Последнее вероятно из-за опечатки: passowrd => password.

Поэтому рекомендуется проверять правильность аргументов, отправляемых на ваш маршрут.

router.post("/login", (req, res) => {
  const email = req.body.email;
  const password = req.body.passowrd;

  if(!email || !password)
    return res.status(400).send('email & password are required');

  /* ... */
});

Поскольку у вас отсутствует обработчик .catch также в .findOne Promise, всегда лучше объединять в цепочку обещания, а не вкладывать их, как вы делаете. Итак, вот полный код:

router.post("/login", (req, res) => {
    const email = req.body.email;
    const password = req.body.passowrd;

    if (!email || !password)
        return res.status(400).send('email & password are required');

    User.findOne({ email })
        .then(user => {
            if (!user) {
                return res.status(404)
                    .json({ message: "User not found" });
            }

            return bcrypt.compare(password, user.passowrd);
        })
        .then(isMatch => {

            if (typeof isMatch !== 'boolean')
                return; // result from `res.status(404)...`

            if (isMatch)
                return res.json({ message: "Success" });

            return res.status(400)
                .json({ message: "Password incorrect" });

        })
        .catch(err => {
            res.status(500).json({ message: 'Internal server error' });
        });

 });

Я пытался добавить .catch (err => console.log (err)); а также .catch (console.log («Что-то пошло не так.»)); до конца обоих .findOne (). then () и .compare (). then (), но это не помогло.

Либо вы неправильно подключили обработчик, либо предупреждение было сгенерировано в другом коде. Но так как в указанном коде нет .catch, который вы упомянули, я не могу подтвердить. В любом случае приведенный фрагмент не вызовет UnhandledPromiseRejectionWarning

...