Node.js 回调和承诺:无法读取属性';然后';未定义的

Node.js 回调和承诺:无法读取属性';然后';未定义的,node.js,bcrypt,Node.js,Bcrypt,我正试图编写一些代码,但我遇到了一个问题,bcrypt使用回调,我正试图用承诺来解决它。代码如下: `UserSchema.statics.findByData = function(username,password) { var User = this; User.findOne({username}).then((user) => { if(!user){ return Promise.reject(); } r

我正试图编写一些代码,但我遇到了一个问题,
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();
  });
我得到一个错误:'cannotreadproperty'then'of undefined


为什么会出现此错误?

如第一条评论中所述,您需要返回
User.findOne
,它将是
promise
。因此,无需创建另一个
承诺
。无论何时返回,
都将使用返回值调用
。您可以使用
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);
         }
       });
   });
};

您没有从
findByData
返回任何内容,因此它是
未定义的。。。