Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

187
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda