Ich bin auf einen Teil des Mongoose-Codes gestoßen, der eine Abfrage findOne und dann eine exec () -Funktion enthielt.
Ich habe diese Methode noch nie in Javascript gesehen? Was macht es genau?
Ich bin auf einen Teil des Mongoose-Codes gestoßen, der eine Abfrage findOne und dann eine exec () -Funktion enthielt.
Ich habe diese Methode noch nie in Javascript gesehen? Was macht es genau?
Antworten:
Grundsätzlich können bei Verwendung von Mungo Dokumente mithilfe von Helfern abgerufen werden. Jede Modellmethode, die Abfragebedingungen akzeptiert, kann mit a callback
oder der exec
Methode ausgeführt werden.
callback
::
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
::
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Wenn Sie keinen Rückruf übergeben, können Sie daher eine Abfrage erstellen und schließlich ausführen.
Weitere Informationen finden Sie in den Mungo-Dokumenten .
AKTUALISIEREN
Bei der Verwendung von Promises in Kombination mit asynchronen Mongoose-Vorgängen ist zu beachten, dass es sich um Mongoose-Abfragen handelt keine Promises sind. Abfragen geben zwar ein thenable zurück , aber wenn Sie ein echtes Versprechen benötigen , sollten Sie die exec
Methode verwenden. Weitere Informationen finden Sie hier .
Während des Updates habe ich festgestellt, dass ich die Frage nicht explizit beantwortet habe:
Ich habe diese Methode noch nie in Javascript gesehen? Was macht es genau?
Also es ist keine native JavaScript-Methode, sondern Teil der Mongoose-API.
exec
Methode noch aufrufen . Dies ist, was sie zumindest in den Dokumenten tun. Um sicher zu sein, können Sie sich mit überprüfen Model.find() instanceof require('bluebird')
. Hoffe das hilft.
Model.update().exec()
sicherstellen, dass es ausgeführt wird. Dann können Sie auf die API antworten, ohne auf ein Update zu warten.
Daniel hat das sehr schön beantwortet. Sehen Sie sich die folgenden Anwendungsfälle an, um eine vollständige Liste der Möglichkeiten zum Erstellen und Ausführen von Abfragen zu erstellen:
Abfrageerstellung
Mungo führt eine Abfrage erst aus , wenn sie aufgerufen wurde then
oder exec
aufgerufen wurde. Dies ist sehr nützlich, wenn Sie komplexe Abfragen erstellen. Einige Beispiele können die Verwendung der Funktionen populate
und umfassen aggregate
.
User.find({name: 'John'}) // Will not execute
Ausführung per Rückruf
Obwohl dies aufgrund seiner Verschachtelung von vielen nicht gemocht wird, können Abfragen ausgeführt werden, indem der optionale Rückruf bereitgestellt wird.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Dann API als Versprechen / A +
Mungo-Abfragen bieten eine then
Funktion. Dies ist nicht mit regelmäßigen Versprechungen zu verwechseln. Einfach ausgedrückt, erfordert die Promises / A + -Spezifikation eine then
Funktion, die so funktioniert, wie wir es mit Versprechungen gewohnt sind.
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
Die Exec-Funktion
Aus Mungo-Dokumenten If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
bei einer Abfrage auch ein Versprechen zurückgeben. Das ist nicht viel anders als exec
. Der Anwendungsfall, den ich praktisch finde, ist, wenn ich so etwas benutze Promise.all
. Ich bin mir nicht sicher, ob das von diesen zurückgegebene Versprechen exec
in solchen Kontexten funktioniert.
exec()
wird ein Versprechen zurückgeben, wenn kein Rückruf erfolgt. Das folgende Muster ist also sehr praktisch und allgemein gehalten - es kann Rückrufe oder Versprechen gut verarbeiten:
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);
}
Ich empfehle, Bluebird-Versprechen mit Mongoose zu verwenden. Verwenden Sie dazu diesen Aufruf:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');