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

422
Visualizações
MongoDB, forEach & Promise: ¿Cómo saber cuándo se realiza un bucle forEach?

Para generar un archivo CSV, quiero crear una matriz de datos de una colección MongoDB.

Uso forEach en una promise y quiero resolve cuando se hayan leído todos los registros.

Sin embargo, mi código a continuación no funciona. La promise nunca se resuelve. Parece que hay un error con la condición if/else . ¿Hay otra forma de saber cuándo finaliza el bucle forEach ?

 exports.eachRecord = function () { return new Promise(function (resolve, reject) { var data = [] mongoClient.connect(process.env.MONGO, function (err, db) { // Handled connection error if (err) { return console.log(err) } db.collection('log').find().forEach(function (doc) { if (doc !== null) { console.log(doc.ug) data.push(doc.ug) } else { db.close() console.log('done!') resolve(data) } }) }) }) }

¿Alguna idea? Muchísimas gracias.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

El mongodb , desde v3.0, admite cursor.forEach(iterator, endCallback)

Debemos distinguir entre:

  • array.forEach: es sincronizar e iterar una matriz de elementos, todos cargados en la memoria después de toArray
  • mongoCursor.forEach: es asíncrono y lo gestiona el controlador mongo. Está transmitiendo los datos, por lo que puede colocarlos en un archivo o en una respuesta http.

Entonces, para archivar sus necesidades, solo necesita agregar una devolución de llamada:

 exports.eachRecord = function () { return new Promise(function (resolve, reject) { const data = [] mongoClient.connect(process.env.MONGO, function (err, db) { if (err) { return reject(err) } db.collection('log').find().forEach( doc => { data.push(doc.ug) }, err => { if (err) { return reject(err) } resolve(data) }) }) }) }
over 4 years ago · Santiago Trujillo Relatório

0

forEach es síncrono.

El problema está en su llamada mongodb, que no es asíncrona. Puede hacerlo asíncrono agregándole una devolución de llamada.

 db.collection('log').find({}, (err, data) => { if (error) ... data.forEach((doc) => { ... }); // Whatever you want to do after forEach. });
over 4 years ago · Santiago Trujillo Relatório

0

Puedes usar este código:

 function getData() { return new Promise((resolve, reject) => { var data = db.collection('credit_history').find({ 'history.dt': '2019-04-25' }).toArray((err, res) => { if (err) reject(err); resolve(res); }); }).catch((ex)=>{ console.log(ex); }); } var array_data =[] ; var data = await getData().then((data)=>{ data.forEach((el)=>{ console.log(el.p); array_data.push(el.p) ; }) });
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