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.

Firestore ‘await addDoc’ (versión web 9) se queda colgado para siempre cuando se pierde la conexión de red.

Estoy utilizando Firestore ‘addDoc’ (versión Web 9, https://firebase.google.com/docs/firestore/manage-data/add-data) para agregar un nuevo documento:

const ref = collection(this.db, 'participants').withConverter(Participant.dataConverter);
const docRef = await addDoc(ref, participant);

Esto funciona muy bien si la conexión de red está bien.

Sin embargo, si me desconecto de Internet desactivando el adaptador de red (Windows), ‘await addDoc’ parece quedarse colgado para siempre (no retorna, las siguientes líneas de código no se ejecutan).

Varios errores de red se muestran continuamente en la consola durante algún tiempo:

zone.js:1465 POST https://firestore.googleapis.com/google.firestore.v1.Firestore/Write/channe…A1%3A447623293743%3Aweb%3Aaadb8ec…%0D%0A&zx=bjcly4sf4lta&t=1 net::ERR_NAME_NOT_RESOLVED
index.esm2017.js:78 [2022-01-03T13:30:28.657Z]  @firebase/firestore: Firestore (9.6.1): Se produjo un error en el transporte de WebChannel de la conexión: 
Vd {type: 'c', target: Y, g: Y, defaultPrevented: false, status: 1}
www.google.com/image…f?zx=lih9uz2upg4y:1 GET https://www.google.com/images/cleardot.gif?zx=lih9uz2upg4y net::ERR_NAME_NOT_RESOLVED

Mientras tanto, se dispara ‘onSnapshot’ y el nuevo documento (obviamente local) se incluye en la lista de documentos.

Si me vuelvo a conectar a Internet (reactivando el adaptador de red) después de unos segundos, el código continúa como si todo hubiera ido normal.

¿Esto es intencionado? ¿Qué puedo hacer para detectarlo? Al menos, no es aceptable que el código deje de ejecutarse…

A pesar de este problema, intentaré detectar problemas de conexión y mostrar algún tipo de advertencia, pero ‘addDoc’ debería retornar un error o lanzar una excepción.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en Javascript, Angular, Firebase y Google Cloud Firestore, entiendo tu preocupación con respecto al comportamiento de addDoc cuando se pierde la conexión de red. El comportamiento que estás experimentando es esperado, ya que addDoc espera una respuesta del servidor antes de retornar. Cuando la red está desconectada, la solicitud no puede completarse y addDoc se queda en espera indefinidamente.

    Para abordar este problema, puedes usar un bloque try-catch para capturar el error lanzado por addDoc cuando se pierde la conexión de red. Luego, puedes manejar el error de manera apropiada, ya sea mostrando un mensaje de advertencia o volviendo a intentar la solicitud cuando se restablezca la conexión.

    Aquí tienes un ejemplo de cómo puedes modificar tu código para capturar el error lanzado por addDoc:

    try {
      const ref = collection(this.db, 'participants').withConverter(Participant.dataConverter);
      const docRef = await addDoc(ref, participant);
      // código para ejecutar si el documento se agrega correctamente
    } catch (error) {
      // código para ejecutar si ocurre un error
      console.log('Error al agregar el documento:', error);
      // muestra un mensaje de advertencia o vuelve a intentar la solicitud cuando se restablezca la conexión
    }
    

    Al utilizar un bloque try-catch, puedes manejar el error lanzado por addDoc y evitar que tu código se quede en espera indefinidamente. Además, puedes aprovechar las capacidades offline del SDK de Firebase para escribir datos localmente cuando la red no está disponible, los cuales se sincronizarán con el servidor cuando se restablezca la conexión.

Comments are closed.