await 函数没有等待异步匿名函数

await function didn't wait asynchronous anonymous function

我尝试使用 await 使我的异步函数像同步任务一样工作,它适用于常规函数。但这对我的匿名函数不起作用。

所以我的 mongoose 模式中有这个函数:

userSchema.methods.comparePassword = function comparePassword(candidatePassword, cb) {
  bcrypt.compare(candidatePassword, this.password, (err, isMatch) => {
    cb(err, isMatch);
  });
};

我尝试使用 bcrypt.compare 验证我的散列密码,这需要我使用匿名函数来获取结果。

所以我尝试使用此功能比较密码:

async (email, password, h) => {
    const user = await User.findOne({email: email, isDeleted: false})
    if (!user) {
        const data = ResponseMessage.error(400, User Not Found')
        return h.response(data).code(400)
    }
    await user.comparePassword(password, (err, isMatch) => {
        if (isMatch) {
            console.log('TRUE')
            return h.response('TRUE')
        } else if (!isMatch) {
            console.log('FALSE')
            return h.response('FALSE')
        }
    })
    console.log('END OF FUNCTION')
    return h.response('DEFAULT')
}

附件:

Response

Console

我尝试 运行 服务器并比较密码,但它给我的结果是 DEFAULT。我尝试使用控制台进行调试,然后它显示 TRUE/FALSEEND OF FUNCTION 之后显示。所以它证明我的功能运行良好,但我的等待功能没有等待我的任务到 运行 另一行。

对我的这个有什么帮助吗?

尝试将其分配给 Promise,如下所示:

userSchema.methods.comparePassword = async (candidatePassword, cb) => {
await new Promise ((resolve, reject)=>{
 bcrypt.compare(candidatePassword, this.password, (err, isMatch) => {
    resolve(cb(err, isMatch));
  });

})
};

您已经为比较函数提供了回调。 bcrypt docs

"Async methods that accept a callback, return a Promise when callback is not specified if Promise support is available."

Promise 支持可能可用,因此请尝试不返回回调,看起来应该可以。 :-)

如果您以后遇到不支持 Promise 的 API,顺便说一下,您可能想看看 Node 的 util.promisify 函数。它将它们转换为基于 Promise 的函数。来自链接文档:

const util = require('util');
const fs = require('fs');
const stat = util.promisify(fs.stat);
const stats = await stat('.');