猫鼬的find()回调实际上并未被调用

阿尔伯特

我是Mongoose的新手,也使用async / await。现在,我有一个Mongoose模式,带有静态方法,如下所示:

const userSchema = new Schema({
    username: String,
    pass: String
});


userSchema.statics.checkExist = async function(username){
    return await this.findOne({username: username}, function(err, res){
        if(err){
            return err;
        }
        if(res){
            return true;
        }
        else{
            return false;
        }
    })
}

静态方法checkExist()应该采用用户名,并检查是否存在具有相同用户名的文档。如果是这样,它将返回true,否则返回false。我在NodeJS / Express服务器中使用它,如下所示:

router.post('/auth/login', async (req, res) =>{
    let username = req.body.username;

    let existBool = await UserModel.checkExist(username);

    console.log(existBool);
    res.send({'hash': existBool});
});

我期望existBool是真/假布尔值。相反,checkExist()似乎根本不调用回调函数。相反,它返回的结果findOne(),这是一个具有匹配的用户名字段的对象。我在这里做错了什么?

苏维埃

您正在混合async/await使用promise的回调您还会误解回调的工作方式。的结果await不是回调的返回值,而是的返回值findOne()

await用于保持直到异步函数返回promise,然后将promise“解包”到变量中。如果该findOne()方法支持promise,则根本不应该使用回调。

let result = await this.findOne({username: username})

之所以async/await如此强大,是因为它消除了对.then()Promise语法的需要,并允许您再次编写顺序代码,但是让它处理异步行为。它允许您使用循环,最重要的是,您可以使用try/catch语句再次处理错误。

try {
  let result = await this.findOne({username: username})
} catch(ex) {
  // handle exception here
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章