Подтвердить что ты не робот

Mongoose - Что делает функция exec?

Я наткнулся на кусок кода Mongoose, который включал запрос findOne, а затем функцию exec().

Я никогда не видел этот метод в Javascript раньше? Что он делает точно?

4b9b3361

Ответ 1

В основном при использовании мангуста документы могут быть получены с помощью помощников. Каждый модельный метод, который принимает условия запроса, может быть выполнен с помощью метода callback или exec.

callback:

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

exec:

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

Поэтому, когда вы не проходите обратный вызов, вы можете создать запрос и в конечном итоге выполнить его.

Дополнительную информацию можно найти в mongoose docs.

UPDATE

Что-то, что следует учитывать при использовании Promises в сочетании с асинхронными операциями Mongoose, заключается в том, что запросы Mongoose не Promises. Запросы возвращают thenable, но если вам нужно настоящее обещание, вы должны использовать метод exec. Более подробную информацию можно найти здесь.

Во время обновления я заметил, что не ответил на вопрос:

Я никогда не видел этот метод в Javascript раньше? Что оно делает точно?

Ну, это не собственный метод JavaScript, но часть API Mongoose.

Ответ 2

Даниэль ответил на это довольно красиво. Чтобы подробно описать исчерпывающий список способов создания и выполнения запросов, просмотрите следующие варианты использования:

построение запросов

Mongoose не будет выполнять запрос до тех пор, пока then или exec не будут вызваны. Это очень полезно при построении сложных запросов. Некоторые примеры могут включать использование функций populate и aggregate.

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

Выполнение через обратный вызов

Несмотря на то, что многие из-за своего гнездования не любят, запросы могут быть выполнены путем предоставления дополнительного обратного вызова.

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

Затем API как Promises/A +

Запросы Mongoose предоставляют функцию then. Это не следует путать с обычным promises. Проще говоря, для спецификации Promises/A + требуется, чтобы функция then работала так же, как и мы с promises.

User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel

Функция exec

От Mongoose docs If you need a fully-fledged promise, use the .exec() function.

User.find({name: 'John'}).exec(); // Will execute returning a promise

Ответ 3

exec() вернет обещание, если обратный вызов не будет предоставлен. Таким образом, следующий шаблон очень удобен и универсален - он может обрабатывать обратные вызовы или promises красиво:

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);

}

Я рекомендую использовать Bluebird promises с Mongoose, чтобы сделать это, используйте этот вызов:

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