尝试使用bcrypt,比较并返回Promise {<pending>}

时间:2019-10-03 16:30:11

标签: javascript node.js async-await aws-lambda bcrypt

我正在尝试使用aws lambda,猫鼬和bcryptjs创建登录api。 我的lambda处理程序使用async,我只是想通过使用bcryptjs模块中的bcrypt.compare()函数将用户输入的密码与数据库中已经哈希的密码进行比较。但是,我的代码不断给我Promise {},所以我尝试了多种方法来解决此问题,但仍然有问题。我是使用异步的新手,所以我可能做的完全错了,所以请不要对我苛刻:)

我通过使用以下代码从MongoDB地图集获取具有加密密码的用户帐户数据,并且它运行良好。

let user = await User.findOne(query).select('_id name email password');

我还有一个在user.js文件中创建的猫鼬方法,如下所示。

UserSchema.methods.comparePassword = function(password) {
     return bcrypt.compare(password, this.password);
};

因此将调用上述方法,并使用以下代码在console.log中打印结果。

let passwordValid = user.comparePassword(parameters.password);
console.log('Password is validated', passwordValid);

它给了我

INFO    Password is validated Promise { <pending> }

在lambda控制台中。

我已经进行了很多搜索,所以我尝试使用await在comparePassword之前,如下所示,但仍然无法正常工作。

let passwordValid = await user.comparePassword(parameters.password);

我还尝试通过使用如下的then()来解决返回的诺言

let passwordValid = user.comparePassword(parameters.password);
passwordValid.then(function(err, result) {
    callback(null, {
       "statusCode": 200,
            "headers": {
                "Content-Type": "application/json"
            },
            "body": JSON.stringify({
                "success": false,
                "content": result
            })
    });
});

但是,这仍然无法按照我的意愿工作。我收到的唯一回复是

 {
   "message": "Internal server error"
 }

1 个答案:

答案 0 :(得分:0)

您看到过这个https://www.npmjs.com/package/bcrypt吗?

在这一行中,需要等待: return bcrypt.compare(password, this.password);

如上面的链接所示:

async function checkUser(username, password) {
    //... fetch user from a db etc.

    const match = await bcrypt.compare(password, user.passwordHash);

    if(match) {
        //login
    }

    //...
}