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?
quelle
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?
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üfenModel.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
oderexec
aufgerufen wurde. Dies ist sehr nützlich, wenn Sie komplexe Abfragen erstellen. Einige Beispiele können die Verwendung der Funktionenpopulate
und umfassenaggregate
.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.
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 einethen
Funktion, die so funktioniert, wie wir es mit Versprechungen gewohnt sind.Die Exec-Funktion
Aus Mungo-Dokumenten
If you need a fully-fledged promise, use the .exec() function.
quelle
then
bei einer Abfrage auch ein Versprechen zurückgeben. Das ist nicht viel anders alsexec
. Der Anwendungsfall, den ich praktisch finde, ist, wenn ich so etwas benutzePromise.all
. Ich bin mir nicht sicher, ob das von diesen zurückgegebene Versprechenexec
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:Ich empfehle, Bluebird-Versprechen mit Mongoose zu verwenden. Verwenden Sie dazu diesen Aufruf:
quelle