Natknąłem się na fragment kodu Mongoose, który zawierał zapytanie findOne, a następnie funkcję exec ().
Nigdy wcześniej nie widziałem tej metody w Javascript? Co to dokładnie robi?
Natknąłem się na fragment kodu Mongoose, który zawierał zapytanie findOne, a następnie funkcję exec ().
Nigdy wcześniej nie widziałem tej metody w Javascript? Co to dokładnie robi?
Odpowiedzi:
Zasadniczo podczas korzystania z mangusty dokumenty można odzyskać za pomocą pomocników. Każda metoda modelowa, która akceptuje warunki zapytania, może być wykonana za pomocą metody callback
lub exec
.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Dlatego jeśli nie przekazujesz wywołania zwrotnego, możesz zbudować zapytanie i ostatecznie je wykonać.
Możesz znaleźć dodatkowe informacje w dokumentach mangusty .
AKTUALIZACJA
Podczas używania Promises w połączeniu z operacjami asynchronicznymi Mongoose należy zwrócić uwagę na to, że zapytania Mongoose nie są Promises. Zapytania zwracają thenable , ale jeśli potrzebujesz prawdziwej obietnicy, powinieneś użyć tej exec
metody. Więcej informacji można znaleźć tutaj .
Podczas aktualizacji zauważyłem, że nie odpowiedziałem wprost na pytanie:
Nigdy wcześniej nie widziałem tej metody w Javascript? Co to dokładnie robi?
Cóż, nie jest to natywna metoda JavaScript, ale część interfejsu API Mongoose.
exec
metodę. Tak przynajmniej robią w dokumentach. Aby mieć pewność, że możesz się sprawdzić Model.find() instanceof require('bluebird')
. Mam nadzieję że to pomoże.
Model.update().exec()
się upewnić, że się wykona. Następnie możesz odpowiedzieć na interfejs API bez czekania na aktualizację.
Daniel odpowiedział na to całkiem pięknie. Aby rozwinąć wyczerpującą listę sposobów tworzenia i wykonywania zapytań, spójrz na następujące przypadki użycia:
Tworzenie zapytań
Mongoose nie wykona zapytanie do czasu then
lub exec
została wezwana niego. Jest to bardzo przydatne podczas tworzenia złożonych zapytań. Niektóre przykłady mogą obejmować użycie funkcji populate
i aggregate
.
User.find({name: 'John'}) // Will not execute
Wykonanie przez callback
Chociaż wielu nie lubi ich ze względu na zagnieżdżanie, zapytania mogą być wykonywane przez dostarczenie opcjonalnego wywołania zwrotnego.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Następnie API jako obietnice / A +
Zapytania Mongoose zapewniają then
funkcję. Nie należy tego mylić z regularnymi obietnicami. Mówiąc najprościej, specyfikacja Promises / A + wymaga, then
aby funkcja działała podobnie jak przyzwyczajeni do obietnic.
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
Funkcja exec
Z dokumentów Mongoose If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
w zapytaniu, aby zwrócić również obietnicę. To niewiele różni się od exec
. Przypadek użycia, który uważam za przydatny, to użycie czegoś takiego Promise.all
. Nie jestem jednak pewien, czy obietnica zwrócona przez exec
prace w takich kontekstach.
exec()
zwróci obietnicę, jeśli nie zostanie udzielone oddzwonienie. Więc następujący wzorzec jest bardzo wygodny i ogólny - może ładnie obsługiwać wywołania zwrotne lub obietnice:
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);
}
Polecam używanie obietnic Bluebird z Mongoose, w tym celu użyj tego wywołania:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');