Я натрапив на шматок коду Mongoose, який включав запит findOne, а потім функцію exec ().
Я ніколи раніше не бачив цього методу в Javascript? Що саме робить?
Я натрапив на шматок коду Mongoose, який включав запит findOne, а потім функцію exec ().
Я ніколи раніше не бачив цього методу в Javascript? Що саме робить?
Відповіді:
В основному, коли використовується мангуст, документи можна отримати за допомогою помічників. Кожен метод моделі, який приймає умови запиту, може бути виконаний за допомогою a callback
абоexec
.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Тому, коли ви не передаєте зворотний виклик, ви можете побудувати запит і врешті виконати його.
Ви можете знайти додаткову інформацію в документах мангуста .
ОНОВЛЕННЯ
Щось, на що слід звернути увагу при використанні Promises у поєднанні з асинхронними операціями Mongoose, це те, що запити Mongoose не є Promises. Запити повертаються підданими , але якщо вам потрібна справжня Обіцянка, вам слід скористатися 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 як Promises / A +
Запити мангуста дійсно надають 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');