我是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] 删除。
我来说两句