Я наткнулся на кусок кода 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 docs.
UPDATE
Что-то, что следует учитывать при использовании Promises в сочетании с асинхронными операциями Mongoose, заключается в том, что запросы Mongoose не Promises. Запросы возвращают thenable, но если вам нужно настоящее обещание, вы должны использовать метод exec
. Более подробную информацию можно найти здесь.
Во время обновления я заметил, что не ответил на вопрос:
Я никогда не видел этот метод в Javascript раньше? Что оно делает точно?
Ну, это не собственный метод JavaScript, но часть API Mongoose.
Даниэль ответил на это довольно красиво. Чтобы подробно описать исчерпывающий список способов создания и выполнения запросов, просмотрите следующие варианты использования:
построение запросов
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
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');