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

问题描述 投票:-2回答:1

我正在尝试编写一些代码并且它可以工作,但我遇到了bcrypt使用回调的问题,我正在尝试用promise来解决它。这是代码:

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

我收到一个错误:`无法读取属性'然后'未定义。

为什么我收到此错误?

node.js bcrypt
1个回答
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);
         }
       });
   });
};
© www.soinside.com 2019 - 2024. All rights reserved.