猫鼬-exec 函数是做什么的?

我偶然发现一段 Mongoose 代码,其中包含一个查询 findOne 和一个 exec ()函数。

我以前从来没有在 Javascript 中见过这个方法? 它到底是做什么的?

133794 次浏览

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

返回文章页面

User.findOne({ name: 'daniel' }, function (err, user) {
//
});

返回文章页面

User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});

因此,当您不传递回调时,您可以构建一个查询并最终执行它。

你可以在 猫鼬医生中找到更多的信息。

更新

在结合使用 我保证和 Mongoose 异步操作时需要注意的是,Mongoose 查询是 没有承诺。查询确实返回一个 可行,但是如果您需要一个 真的承诺,您应该使用 exec方法。更多信息可以找到 给你

在更新过程中,我注意到自己没有明确回答这个问题:

我以前从来没有在 Javascript 中见过这个方法? 它是做什么的 到底是什么?

它是 没有,一个原生的 JavaScript 方法,但是是 Mongoose API 的一部分。

丹尼尔回答得很漂亮。要详细说明构建和执行查询的方法的详尽列表,请看以下用例:

查询大楼

在调用 thenexec之前,Mongoose 不会执行查询。这在构建复杂查询时非常有用。一些示例可以包括使用 populateaggregate函数。

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

通过回调执行

尽管很多人不喜欢它的嵌套性质,但是可以通过提供可选的回调来执行查询。

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

然后 API 作为承诺/A +

Mongoose 查询确实提供了 then函数。不要把这与常规承诺混为一谈。简单地说,承诺/A + 规范需要一个 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

如果没有提供回调,exec()将返回一个承诺。因此,下面的模式是非常方便和通用的-它可以很好地处理回调或承诺:

function findAll(query, populate, cb) {


let q = Response.find(query);


if (populate && populate.length > 0) {
q = q.populate(populate);
}


// cb is optional, will return promise if cb == null
return q.lean().exec(cb);


}

我建议对 Mongoose 使用 Bluebird 承诺,要做到这一点,可以使用以下调用:

const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');

所有的答案都是正确的,但是最简单的方法是使用现代异步等待方法。

async ()=> {
const requiresUser = await User.findByIdAndUpdate(userId,{name:'noname'},{ new:true}).exec()

我从不使用 exec()函数来完成模型的 CRUD (创建、读取、更新、删除)。当我想在模型上使用 CRUD 时,我是这样使用它的:

const user = await UserModel.findOne(userCondition);

它总是起作用,所以我想知道“ exec()用来做什么”? 当我在猫鼬文档中搜索时,我找到了答案 给你

应该使用 exec ()和 waiting 吗?

故事是这样的。
对模型执行查询有两种方法。使用 callback或使用 exec()函数。“但是”你也可以用 awaitexec()函数返回一个承诺,即您可以将它与 then()async/await一起使用来对模型“异步”执行查询。所以问题是“如果我只能使用 user = await UserModel.find()并且它能正常工作,那么为什么我要使用 exec()函数呢?”.在 文件中可以找到的答案是: < br > < br > 使用 await与使用 exec()与不使用 await有两个区别

  • 从功能的角度来看,使用 await与使用 exec()或不使用 await没有区别。当你调用一个没有 exec()或者 callback的查询时,它会返回一个 thenable,这个 thenable看起来有点像承诺,但不是承诺。(你可以找到差异 给你)。但是当您使用 exec()运行查询时,您将得到一个确切的允诺作为响应。
// returns a thenable as response that is not a promise, but you can use await and then() with it.
const user = await UserModel.findOne(userCondition);


// returns exactly a promise.
const user = await UserModel.findOne(userCondition).exec();
  • 另一个区别是,如果在 exec()中使用 await,如果在执行查询时发现任何错误,则可以获得更好的“堆栈跟踪”。所以:

    这两行,做同样的事情:
const user = await UserModel.findOne(userCondition);


// does exactly as the before line does, but you get a better stack trace if any error happened
const user = await UserModel.findOne(userCondition).exec();

一种获取数据的方法,

Find () . exec ((err,data) = > {

})

另一边,

Const res = waiting find ()

基本上,猫鼬查询不会返回任何承诺。因此,如果我们希望它们像承诺一样工作,我们使用 exec 函数。