不能 return 数据从 nodejs 中的 bcrypt.compare() 函数中获取

Can't return data out of the bcrypt.compare() function in nodejs with promises

我目前正在使用 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()-函数 returns 未定义。但是,当我将其更改为以下内容时,它可以完美运行(只是不检查密码...):

  login(email, password) {
    return userModel.findOne({
      email: email
    }).lean().then(function(user) {
    return user;
    });
};

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

我的兄弟,问题在于一个 promise 只会 return 你另一个 promise 和你在那里的比较回调,正如它的名字所说的回调不是一个 promise。让我们承诺一下


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