Encontré un fragmento de código de Mongoose que incluía una consulta findOne y luego una función exec ().
¿Nunca había visto ese método en Javascript antes? ¿Qué hace exactamente?
fuente
Encontré un fragmento de código de Mongoose que incluía una consulta findOne y luego una función exec ().
¿Nunca había visto ese método en Javascript antes? ¿Qué hace exactamente?
Básicamente, cuando se usa mangosta, los documentos se pueden recuperar usando ayudantes. Cada método de modelo que acepta condiciones de consulta se puede ejecutar mediante un método callback
o exec
.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Por lo tanto, cuando no pasa una devolución de llamada, puede crear una consulta y finalmente ejecutarla.
Puede encontrar información adicional en los documentos de mangosta .
ACTUALIZAR
Algo a tener en cuenta al usar Promesas en combinación con operaciones asíncronas de Mongoose es que las consultas de Mongoose no son Promesas. Las consultas devuelven un thenable , pero si necesita una Promesa real , debe usar el exec
método. Puede encontrar más información aquí .
Durante la actualización, noté que no respondí explícitamente a la pregunta:
¿Nunca había visto ese método en Javascript antes? ¿Qué hace exactamente?
Bueno, no es un método JavaScript nativo, sino parte de la API de Mongoose.
exec
método. Esto es lo que hacen al menos en los documentos. Para estar seguro, puede comprobarlo usted mismoModel.find() instanceof require('bluebird')
. Espero que esto ayude.Model.update().exec()
asegurarse de que se ejecutará. Luego, puede responder a la API sin esperar la actualización.Daniel ha respondido a esto muy bien. Para elaborar una lista exhaustiva de formas de crear y ejecutar consultas, observe los siguientes casos de uso:
Construcción de consultas
Mangosta no se ejecutará hasta que una consulta
then
oexec
ha sido llamado sobre ella. Esto es muy útil cuando se crean consultas complejas. Algunos ejemplos pueden incluir el uso de las funcionespopulate
yaggregate
.Ejecución mediante devolución de llamada
Aunque a muchos no les gusta debido a su naturaleza anidada, las consultas se pueden ejecutar proporcionando la devolución de llamada opcional.
Luego API como Promesas / A +
Las consultas de Mongoose proporcionan una
then
función. Esto no debe confundirse con promesas regulares. En pocas palabras, la especificación Promises / A + requiere que unathen
función funcione de manera muy similar a como estamos acostumbrados con las promesas.La función ejecutiva
De los documentos de Mongoose
If you need a fully-fledged promise, use the .exec() function.
fuente
then
en una consulta para devolver una promesa. Esto no es muy diferente aexec
. El caso de uso que encuentro útil es cuando se usa algo comoPromise.all
. Sinexec
embargo, no estoy seguro de si la promesa devuelta por funciona en tales contextos.exec()
devolverá una promesa si no se proporciona ninguna devolución de llamada. Entonces, el siguiente patrón es muy conveniente y genérico: puede manejar devoluciones de llamada o promesas muy bien:Recomiendo usar las promesas de Bluebird con Mongoose, para hacer eso, use esta llamada:
fuente