【问题标题】:Can't return data out of the bcrypt.compare() function in nodejs with promises无法通过承诺从 nodejs 中的 bcrypt.compare() 函数返回数据
【发布时间】:2020-07-17 10:05:06
【问题描述】:

我目前正在使用 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 部分有问题,但我找不到解决方案。

【问题讨论】:

    标签: javascript node.js mongoose async-await bcrypt


    【解决方案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;
        })
    };
    

    【讨论】:

    • 您好,非常感谢!第一个 sn-p 成功了(即使我使用的是你链接的包......)
    猜你喜欢
    • 2019-05-27
    • 2020-03-06
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多