Je suis tombé sur un morceau de code Mongoose qui comprenait une requête findOne puis une fonction exec ().
Je n'ai jamais vu cette méthode en Javascript avant? Que fait-il exactement?
la source
Je suis tombé sur un morceau de code Mongoose qui comprenait une requête findOne puis une fonction exec ().
Je n'ai jamais vu cette méthode en Javascript avant? Que fait-il exactement?
Fondamentalement, lorsque vous utilisez la mangouste, les documents peuvent être récupérés à l'aide des helpers. Chaque méthode de modèle qui accepte les conditions de requête peut être exécutée au moyen de a callback
ou de la exec
méthode.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Par conséquent, lorsque vous ne transmettez pas de rappel, vous pouvez créer une requête et éventuellement l'exécuter.
Vous pouvez trouver des informations supplémentaires dans la documentation sur la mangouste .
METTRE À JOUR
Quelque chose à noter lors de l'utilisation de Promises en combinaison avec des opérations asynchrones Mongoose est que les requêtes Mongoose ne sont pas des promesses. Les requêtes renvoient un alorsable , mais si vous avez besoin d'une vraie promesse, vous devez utiliser la exec
méthode. Plus d'informations peuvent être trouvées ici .
Lors de la mise à jour, j'ai remarqué que je n'avais pas répondu explicitement à la question:
Je n'ai jamais vu cette méthode en Javascript avant? Que fait-il exactement?
Ce n'est pas une méthode JavaScript native, mais une partie de l'API Mongoose.
exec
méthode. C'est au moins ce qu'ils font dans la documentation. Pour être sûr de pouvoir vérifier vous-même avecModel.find() instanceof require('bluebird')
. J'espère que cela t'aides.Model.update().exec()
vous assurer qu'il s'exécutera. Ensuite, vous pouvez répondre à l'API sans attendre la mise à jour.Daniel a très bien répondu à cela. Pour élaborer une liste exhaustive des moyens de créer et d'exécuter des requêtes, examinez les cas d'utilisation suivants:
Création de requêtes
Mangouste n'exécutera une requête jusqu'à ce que
then
ouexec
a été fait appel à elle. Ceci est très utile lors de la création de requêtes complexes. Certains exemples peuvent inclure l'utilisation des fonctionspopulate
etaggregate
.Exécution par rappel
Bien que beaucoup n'aiment pas en raison de sa nature d'imbrication, les requêtes peuvent être exécutées en fournissant le rappel facultatif.
Puis l'API comme promesses / A +
Les requêtes Mongoose fournissent une
then
fonction. Cela ne doit pas être confondu avec des promesses régulières. En termes simples, la spécification Promises / A + nécessite unethen
fonction pour fonctionner de la même manière que nous sommes habitués aux promesses.La fonction exec
Tiré de la documentation Mongoose
If you need a fully-fledged promise, use the .exec() function.
la source
then
une requête pour renvoyer une promesse. Ce n'est pas très différent deexec
. Le cas d'utilisation que je trouve pratique est celui de l'utilisation de quelque chose commePromise.all
. Je ne sais pas si la promesse retournée parexec
fonctionne dans de tels contextes.exec()
renverra une promesse si aucun rappel n'est fourni. Le modèle suivant est donc très pratique et générique - il peut bien gérer les rappels ou les promesses:Je recommande d'utiliser les promesses de Bluebird avec Mongoose, pour ce faire, utilisez cet appel:
la source