Обратный вызов и обещания: не может прочитать свойство then из неопределенного - PullRequest
0 голосов
/ 31 октября 2018

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

`UserSchema.statics.findByData = function(username,password) {
   var User = this;
   User.findOne({username}).then((user) => {
       if(!user){
         return Promise.reject();
       }

      return new Promise((resolve,reject) => {
        bcrypt.compare(password,user.password,(err,res) => {
          if(res){
            resolve(user);
          }else {
            reject();
          }
        });
      });
   });
};`

Я вызываю эту функцию отсюда:

User.findByData(body.username,body.password).then((user) => {
      res.send(user);
  }).catch((e) => {
      res.status(400).send();
  });

Я получаю сообщение об ошибке: "Cannot read property" then "undefined.

Почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 31 октября 2018

Как указано в первом комментарии, вам нужно вернуть User.findOne, что будет promise. Поэтому не нужно создавать еще promise. всякий раз, когда вы вернетесь, then будет вызываться с возвращенным значением. Вы также можете использовать Promise.reject() и Promise.resolve() для вызова catch и then соответственно.

UserSchema.statics.findByData = function(username,password) {
   var User = this;
   return User.findOne({username}).then((user) => {
       if(!user){
         Promise.reject('No user found');
       }
       bcrypt.compare(password,user.password,(err,res) => {
         if(res){
           Promise.resolve(user);
         }else {
           Promise.reject(err);
         }
       });
   });
};
...