Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

180
Vistas
async no devuelve datos en la devolución de llamada después de la actualización de mongoose

En mi proyecto, uso async para consultas asincrónicas a la base de datos y tengo este código:

 async.auto({ one: function(callback){ getFriendsIds(userId, callback) }, two: ['one', function(callback, results){ getFriendsDetails(results.one, callback); }], final: ['one', 'two', function(callback, results) { res.status(200).send(results.two); return; }], }, function(err) { if (err) { sendError(res, err); return; } });

El método que devuelve las identificaciones de los amigos se ve así:

 function getFriendsIds(userId, callback) { var query = User.findOne({_id: userId}); query.exec(function(err, user) { if(err) { callback(err); return; } return callback(null, user.friendsIds); }); }

Funcionó perfectamente. La función devolvió las identificaciones de los amigos y las usé en el bloque "dos" de la llamada asíncrona.

Después de actualizar mongoose de 4.3.7 a 4.7.8 , dejó de funcionar. Empecé a recibir Mongoose: mpromise (mongoose's default promise library) is deprecated, plug in your own promise library instead de una advertencia y las identificaciones ya no se devolvieron en la devolución de llamada.

Así que agregué el paquete bluebird al proyecto y lo conecté a mongoose . Ahora la advertencia desapareció, pero los identificadores aún no se devuelven en la devolución de llamada.

También actualicé async a la versión más reciente, pero tampoco ayudó.

¿Hay algo más que deba hacer para que esto funcione?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

La idea de usar promesas es no usar devoluciones de llamada, y todavía estás usando devoluciones de llamada en tu código.

Suponiendo que necesita bluebird como

mongoose.Promise = require('bluebird');

su función ahora debería verse así:

 function getFriendsIds(userId) { //This will now be a bluebird promise //that you can return return User.findOne({_id: userId}).exec() .then(function(user){ //return the friendIds (this is wrapped in a promise and resolved) return user.friendsIds; }); }

El valor de retorno de la función será una matriz de user.friendsIds . Aprovechando las posibilidades de encadenamiento de las promesas, puede escribir una función que obtenga los detalles de cada amigo y los devuelva como una matriz de friendDetails .

 function getFriendsDetails(friendIds) { //For each friendId in friendIds, get the details from another function //(Promise = require("bluebird") as well) return Promise.map(friendIds, function(friendId) { //You'll have to define the getDetailsOfFriend function return getDetailsOfFriend(friendId); }); }

y simplemente llámalo como

 getFriendsIds(123) .then(getFriendsDetails) //the resolved value from previous function will be passed as argument .then(function(friendDetails) { //friendDetails is an array of the details of each friend of the user with id 123 }) .catch(function(error){ //Handle errors });

Si desea escribir menos código, puede dejar que bluebird prometa las funciones de mangosta como esta

 Promise.promisify(User.findOne)(123) .then(function(user){ return user.friendsIds; }) .then(getFriendsDetails) .then(function(friendDetails) { //Return or do something with the details }) .catch(function(error){ //Handle error });
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda