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

180
Vistas
¿Moderación de mensajes opcionales en el chat de base de datos en tiempo real de Firebase?

Estoy implementando un chat usando Firebase Realtime DB . Hay un requisito, que algunas salas de chat pueden mostrar mensajes nuevos de forma predeterminada, pero los mensajes en diferentes salas de chat deben aprobarse primero antes de mostrarlos.

La estructura de la base de datos en Firebase está anidada así:

 /chat/$roomID/$messageID/

y cada objeto de mensaje está estructurado de la siguiente manera:

 { user: string content: string isApproved: boolean clientStamp: number // client-side unix timestamp serverStamp: number // server-side unix timestamp, via `firebase.database.ServerValue.TIMESTAMP` }

Tener solo las salas de chat de visualización predeterminada sería fácil: ordenaría los datos por serverStamp :

 let query = DBConn.ref('chat/' + roomID).orderByChild('serverStamp').limitToLast(50); query.on("value", snapshot => { // set the list of messages to display this.appendSnapshot(snapshot); });

Sin embargo, la regla de aprobar primero dificulta este enfoque. La solución obvia sería mostrar solo los mensajes con el atributo isApproved establecido en true . Pero si consultara los últimos N mensajes ordenados por marca de tiempo y alguien publicara N mensajes no aprobados, eso eliminaría cualquiera de los mensajes aprobados del resultado de la consulta y el chat estaría vacío. Realtime DB tiene la siguiente limitación, lo que hace que sea imposible realizar consultas tanto por marca de tiempo + isApproved :

Solo puede usar un método de ordenar a la vez

Así que ahora mismo lo estoy solucionando de la siguiente manera:

  • los mensajes se ordenan por clientStamp (marca de tiempo de Unix del lado del cliente) en lugar de serverStamp
  • cuando envío un nuevo mensaje al servidor, divido el valor de clientStamp por dos, lo que significa que estos nuevos mensajes nunca eliminarán los mensajes anteriores ya aprobados del resultado de la consulta (ya que su marca de tiempo tiene un valor más alto)
  • cuando se aprueba un mensaje, el valor de clientStamp se establece en un valor de firebase.database.ServerValue.TIMESTAMP (hora del servidor), lo que lo empuja a la parte superior de la consulta de chat ( orderByChild('serverStamp') )

... pero esto es más bien una solución rápida. ¿Hay alguna manera de hacer que esto funcione bien tanto para las salas de chat de mostrar por defecto como para aprobar primero?

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Me gusta su enfoque al establecer la marca de tiempo como parte de un flujo de aprobación. 👍

La solución más común es la que documenté en Query basada en múltiples cláusulas where en Firebase

Aquí, eso significaría que tiene una propiedad isApproved_serverStamp donde almacena los valores combinados de las propiedades isApproved y serverStamp , como true_1632065222747 . A continuación, puede consultar los mensajes aprobados más recientes con:

 DBConn.ref('chat/' + roomID).orderByChild('isApproved_serverStamp').startAt("true_").limitToLast(50)
about 4 years ago · Juan Pablo Isaza Denunciar
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