Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

183
Views
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 answers
Answer question

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!