猫鼬 - 执行函数有什么作用?
2022-08-30 02:34:50
我遇到了一段猫鼬代码,其中包含一个查询findOne,然后是一个exec()函数。
我以前在Javascript中从未见过这种方法吗?它到底做了什么?
我遇到了一段猫鼬代码,其中包含一个查询findOne,然后是一个exec()函数。
我以前在Javascript中从未见过这种方法吗?它到底做了什么?
基本上,当使用猫鼬时,可以使用助手检索文档。每个接受查询条件的模型方法都可以通过 或 方法执行。callback
exec
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
因此,当您不传递回调时,您可以构建查询并最终执行它。
您可以在猫鼬文档中找到更多信息。
更新
将 Promise 与 Mongoose 异步操作结合使用时需要注意的是,Mongoose 查询不是 Promise。查询确实返回一个 thenable,但如果你需要一个真正的 Promise,你应该使用这个方法。更多信息可以在这里找到。exec
在更新过程中,我注意到我没有明确回答这个问题:
我以前在Javascript中从未见过这种方法吗?它到底做了什么?
好吧,它不是一个原生的JavaScript方法,而是Mongoose API的一部分。
丹尼尔已经相当漂亮地回答了这个问题。要详细说明构建和执行查询的方法的详尽列表,请查看以下用例:
查询构建
Mongoose 不会执行查询,直到或已经调用它。这在构建复杂查询时非常有用。一些示例可以包括使用 和 函数。then
exec
populate
aggregate
User.find({name: 'John'}) // Will not execute
通过回调执行
尽管由于其嵌套性质而被许多人不喜欢,但可以通过提供可选的回调来执行查询。
User.find({name: 'John'}, (err, res) => {}) // Will execute
然后API作为承诺/A+
猫鼬查询确实提供了一个函数。这不应与常规承诺相混淆。简而言之,Promises/A+规范需要一个函数来工作,就像我们习惯于使用承诺一样。then
then
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
执行功能
从 猫鼬 文档If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise