es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Javascript Promise – El segundo then se ejecuta antes del primero

He creado un script simple para obtener actividades de Strava y guardarlas en una base de datos de MongoDB, pero me encontré con el siguiente problema:

Mi conexión a la base de datos se desconecta antes de que se puedan obtener y confirmar las actividades. El siguiente código produce la siguiente salida:

const stravaApi = require('strava-v3');
const mongoose = require('mongoose');
const Activity = require('./models/Activity');

mongoose.connect(process.env.DB_CONNECTION, () => console.log('conectado a la DB'))

strava = new stravaApi.client(accessToken)
strava.athlete.listActivities({per<em>page: 2})
        .then(payload => {
            let activities = []
            for (let strava_activity of payload) {
                const activity = new Activity({
                        activityId: strava_activity['id'],
                        name: strava_activity['name'],
                        date: strava_activity['start_date'],
                        type: strava_activity['type'],
                        distance: strava_activity['distance']
                })
                activity.save()
                    .then(data => {
                        console.log(`Actividad de fecha ${strava_activity['start_date']} guardada en la DB`);
                     })
                    .catch(err => {
                        console.log(err)
                    })
            }
        })
        .then(() => {
            console.log('Inicio de la desconexión')
            mongoose.disconnect().then(() => {
                console.log("Desconexión de la DB exitosa")
            })
        })
        .catch(err => {
            console.log(err)
        })

Salida
conectado a la DB
Desconexión de la DB exitosa
(Mensaje de error)
(Mensaje de error)

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con este script es que la conexión a la base de datos se está desconectando antes de que la cadena de promesas para obtener y guardar las actividades se haya completado. Esto significa que es posible que las actividades no se hayan guardado correctamente en la base de datos antes de que se cierre la conexión. Para solucionar esto, puedes mover el código de desconexión de la base de datos dentro de la cadena de promesas para guardar actividades.

    const stravaApi = require('strava-v3');
    const mongoose = require('mongoose');
    const Activity = require('./models/Activity');
    
    mongoose.connect(process.env.DB_CONNECTION, () => console.log('conectado a la base de datos'))
    
    strava = new stravaApi.client(accessToken)
    strava.athlete.listActivities({per_page: 2})
      .then(payload => {
        let activities = []
        for (let strava_activity of payload) {
          const activity = new Activity({
            activityId: strava_activity['id'],
            name: strava_activity['name'],
            date: strava_activity['start_date'],
            type: strava_activity['type'],
            distance: strava_activity['distance']
          })
          activity.save()
            .then(data => {
              console.log(`Actividad de fecha ${strava_activity['start_date']} guardada en la base de datos`);
              if (payload.indexOf(strava_activity) === payload.length-1) {
                console.log('Iniciando desconexión')
                mongoose.disconnect().then(() => {
                  console.log("Desconexión de la base de datos realizada exitosamente")
                })
              }
            })
            .catch(err => {
              console.log(err)
            })
        }
      })
      .catch(err => {
        console.log(err)
      })
    

    En este código actualizado, hemos agregado una verificación para ver si la actividad actual que se está guardando es la última actividad en el conjunto de datos. Si lo es, entonces nos desconectamos de la base de datos y mostramos un mensaje para indicar que la desconexión fue exitosa. Esto garantiza que todas las actividades se guarden antes de que se cierre la conexión con la base de datos.

    Cabe señalar que esta solución asume que todas las actividades se guardarán correctamente en la base de datos. Si hay un error en el proceso de guardado, la desconexión no se realizará correctamente. Puede ser necesario agregar código adicional para manejar casos donde no se guarden todas las actividades correctamente.

Comments are closed.