猫鼬 - 执行函数有什么作用?

2022-08-30 02:34:50

我遇到了一段猫鼬代码,其中包含一个查询findOne,然后是一个exec()函数。

我以前在Javascript中从未见过这种方法吗?它到底做了什么?


答案 1

基本上,当使用猫鼬时,可以使用助手检索文档。每个接受查询条件的模型方法都可以通过 或 方法执行。callbackexec

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的一部分。


答案 2

丹尼尔已经相当漂亮地回答了这个问题。要详细说明构建和执行查询的方法的详尽列表,请查看以下用例:

查询构建

Mongoose 不会执行查询,直到或已经调用它。这在构建复杂查询时非常有用。一些示例可以包括使用 和 函数。thenexecpopulateaggregate

User.find({name: 'John'}) // Will not execute

通过回调执行

尽管由于其嵌套性质而被许多人不喜欢,但可以通过提供可选的回调来执行查询。

User.find({name: 'John'}, (err, res) => {}) // Will execute

然后API作为承诺/A+

猫鼬查询确实提供了一个函数。这不应与常规承诺相混淆。简而言之,Promises/A+规范需要一个函数来工作,就像我们习惯于使用承诺一样。thenthen

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