为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

RISEBY 2022-06-16 10:06:08
我目前正在使用 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 部分有问题,但我找不到解决方案。
查看完整描述

1 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

我的兄弟,问题在于一个承诺只会给你返回另一个承诺,而你在那里的比较回调正如它的名字所说的回调不是承诺。让我们成为一个承诺



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;

    })

};


查看完整回答
反对 回复 2022-06-16
  • 1 回答
  • 0 关注
  • 105 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信