回调和承诺:无法读取未定义的属性“ then”

时间:2018-10-31 01:22:47

标签: node.js bcrypt

我正在尝试编写一些代码,并且可以正常工作,但是我遇到了一个问题,其中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();
  });

我得到一个错误:无法读取未定义的属性'then'。

为什么我会收到此错误?

1 个答案:

答案 0 :(得分:2)

如第一条评论所述,您需要返回User.findOne,即promise。因此,无需创建另一个promise。每当您返回时,将使用返回的值调用then。您也可以使用Promise.reject()Promise.resolve()分别呼叫catchthen

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);
         }
       });
   });
};