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

200
Vistas
¿Cómo me aseguro de que las operaciones asíncronas finalicen antes de enviar una respuesta en Express.js?

Estoy tratando de:

  1. Recuperar una matriz de objetos que contienen información de cuenta de mi base de datos,
  2. Use el account_id de esas cuentas para realizar una solicitud de recuperación a una API externa para cada una de las cuentas y recuperar transacciones
  3. Recorra todas las transacciones de cada cuenta y guárdelas una por una en mi base de datos.
  4. Envíe las transacciones recién guardadas de vuelta a la interfaz como respuesta a la llamada API

Todo funciona muy bien, excepto que la última parte de mi código que está fuera de los dos bucles se ejecuta antes de que finalicen las tareas asíncronas.

Mi pregunta es: ¿cómo me aseguro de que la última parte del código (console.log y la consulta de base de datos que recupera las transacciones recién guardadas) se ejecute después de que finalicen todas las tareas asíncronas?

Estaba tratando de usar devoluciones de llamada / promesas y seguir otras guías, pero no logré que funcionara, ¡así que agradecería alguna ayuda!

Tengo el siguiente código Express.js:

 router.post("accounts/transactions", async (req, res) => { //user id sent from frontend const user_id = req.body.user_id; //Find accounts by user_id in DB const accounts = Account.find({ user_id: user_id }).then((accounts) => { return accounts; }); //Once accounts retrieved from DB, loop over them and fetch transactions for each account (await accounts).forEach(async (account) => { const url = `https://someExternalApi.whatever/${account.accountId}/transactions`; const options = { //fetch request options }; const response = await fetch(url, options) .then((res) => res.json()) .catch((e) => { console.error({ message: "Error!", error: e, }); }); //Once transactions for a single account are retrieved from external API, //loop over them and save them one-by-one to DB (await response).transactions.booked.forEach(async (transaction) => { const filter = { transactionId: transaction.transactionId }; const mongooseOptions = { upsert: true, new: true }; const update = { user_id: user_id, //...other keys-value pairs for transaction record updated: Date.now(), }; //Save single transaction to DB Transaction.findOneAndUpdate(filter, update, mongooseOptions) .then( console.log( `Transaction ${ transaction.transactionId } saved!` ) ) .catch((error) => console.log(error)); }); }); //The problem is that the below runs before the above async operations are finished console.log("All transactions updated!"); Transaction.find({ user_id: user_id }).then((transactions) => { res.json(transactions); }); });

¡Gracias!

about 4 years ago · Juan Pablo Isaza
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