猿问

无法通过承诺从 nodejs 中的 bcrypt.compare() 函数返回数据

我目前正在使用 nodejs (10.15.2) 构建一个应用程序,但我在登录功能方面遇到了一些问题。


我的“dbconnector.js”文件中的片段:


login(email, password) {

    return userModel.findOne({

      email: email

    }).lean().then(function(user) {

      // return user;

      return bcrypt.compare(password, user.password, function(err, res) {


           if (res) {

              console.log(user); //prints the userinfo - works fine

              return user;

          }

        });

    });

};

我的 serve.js 文件中的片段:


app.post('/login', async (req, res) => {


    var { email, password } = req.body;

    var user = await dbconnector.login(email,password);

    console.log(user) //returns undefined


    if (user != false) {

      console.log("loggedin");

        const accessToken = jwt.sign({ email: user.email,  id: user.id }, key.tokenKey);


        res.json({

            accessToken

        });

    } else {

        res.send('Username or password incorrect');

    }

});

我的问题是login() -函数返回未定义。但是,当我将其更改为以下内容时,它可以完美运行(只是不检查密码......):


  login(email, password) {

    return userModel.findOne({

      email: email

    }).lean().then(function(user) {

    return user;

    });

};

所以我知道 bcrypt / promise 部分有问题,但我找不到解决方案。


RISEBY
浏览 106回答 1
1回答

沧海一幻觉

我的兄弟,问题在于一个承诺只会给你返回另一个承诺,而你在那里的比较回调正如它的名字所说的回调不是承诺。让我们成为一个承诺login(email, password) {    return userModel.findOne({      email: email    }).lean().then(function(user) {      // return user;      return new Promise((resolve, reject) => {          return bcrypt.compare(password, user.password, (err, res) => {              if (err) {                  return reject(err);              }              return resolve(res);        })};但!!!如果您正在使用的 bcrypt 包是这个 https://www.npmjs.com/package/bcrypt 那么您不必承诺该方法,它已经将其作为承诺login(email, password) {    return userModel.findOne({      email: email    }).lean().then(function(user) {      return bcrypt.compare(password, user.password);    }).then(isEquals => {        if (isEquals) {            return true        }        return false    }).catch(error => {        throw error;    })};
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答