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

Callback and Promises : cannot read property 'then' of undefined

我正在尝试编写一些代码并且它可以工作,但是我 运行 遇到了 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 '。

为什么会出现这个错误?

如第一条评论所述,您需要 return User.findOne,即 promise。所以不需要创建另一个 promise。无论何时 return,then 都将使用 returned 值调用。您也可以使用 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);
         }
       });
   });
};