Я наткнулся на фрагмент кода Mongoose, который включал запрос findOne, а затем функцию exec ().
Я никогда раньше не видел этот метод в Javascript? Что именно он делает?
Я наткнулся на фрагмент кода Mongoose, который включал запрос findOne, а затем функцию exec ().
Я никогда раньше не видел этот метод в Javascript? Что именно он делает?
Ответы:
Обычно при использовании мангуста документы можно получить с помощью помощников. Каждый метод модели, который принимает условия запроса, может быть выполнен с помощью метода callback
или exec
метода.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Поэтому, когда вы не передаете обратный вызов, вы можете создать запрос и в конечном итоге выполнить его.
Вы можете найти дополнительную информацию в документации мангуста .
ОБНОВИТЬ
При использовании обещаний в сочетании с асинхронными операциями Mongoose следует отметить, что запросы Mongoose не являются обещаниями. Запросы действительно возвращают значение , но если вам нужно настоящее обещание, вы должны использовать этот exec
метод. Более подробную информацию можно найти здесь .
Во время обновления я заметил, что не ответил прямо на вопрос:
Я никогда раньше не видел этот метод в Javascript? Что именно он делает?
Ну, это не собственный метод JavaScript, а часть API Mongoose.
exec
метод. По крайней мере, это то, что они делают в документации. Конечно, вы можете проверить себя с помощью Model.find() instanceof require('bluebird')
. Надеюсь это поможет.
Model.update().exec()
убедиться, что он будет выполнен. Затем вы можете ответить на api, не дожидаясь обновления.
Дэниел ответил на это довольно красиво. Чтобы разработать исчерпывающий список способов построения и выполнения запросов, рассмотрите следующие варианты использования:
Построение запросов
Mongoose не выполнит запрос до тех пор , then
или exec
была вызвана на него. Это очень полезно при построении сложных запросов. Некоторые примеры могут включать в себя , используя populate
и aggregate
функции.
User.find({name: 'John'}) // Will not execute
Выполнение через обратный вызов
Хотя это не нравится многим из-за его вложенности, запросы можно выполнять, предоставляя дополнительный обратный вызов.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Тогда API как обещание / A +
Запросы Mongoose действительно предоставляют then
функцию. Это не следует путать с обычными обещаниями. Проще говоря, спецификация Promises / 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
Функция exec
Из документации Mongoose If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
запрос для возврата обещания. Это не сильно отличается от exec
. Вариант использования, который я считаю удобным, - это использование чего-то вроде Promise.all
. Не уверен, что обещание, возвращаемое функцией, exec
работает в таких контекстах.
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);
}
Я рекомендую использовать обещания Bluebird с Mongoose, для этого используйте этот вызов:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');