Tengo una aplicación de chat en reaccionar nativo usando firebase y es crucial para mí que las marcas de tiempo estén todas sincronizadas y creadas en el servidor, no desde el cliente. Los clientes pueden tener diferentes tiempos dependiendo de la configuración en el teléfono móvil.
Probé la siguiente función para probar mi punto:
const comparetimes = async () => { const timezone1 = firebase.firestore.Timestamp.now(); const timezone2 = (firebase.firestore.Timestamp.now()).toMillis(); const timezone3 = Date.now(); console.log(timezone1); console.log(timezone2); console.log(timezone3) }Lo que me sorprendió es el resultado de esta función:
{"nanoseconds": 79000000, "seconds": 1641054839} 1641054839080 1641054839080 Aparentemente, la marca de tiempo de Firebase es exactamente la misma que Date.now() que es una marca de tiempo directa tomada del teléfono móvil y, por lo tanto, no es precisa.
¿Qué puedo hacer para que las marcas de tiempo no sean creadas por el cliente sino por el servidor, en este ejemplo de base de fuego? ¿Necesito verificar algunas API o hay algo que extraño aquí?
Cuando llama a Timestamp.now() , en realidad solo está tomando la marca de tiempo en el dispositivo cliente. Eso es de esperar.
Lea la documentación sobre cómo usar las marcas de tiempo del servidor. Debe usar el valor del token devuelto por firestore.FieldValue.serverTimestamp() para indicarle a Firestore que use el momento actual cuando la solicitud llega al servidor.
Al almacenar marcas de tiempo, se recomienda utilizar el método estático serverTimestamp en la clase FieldValue. Cuando se escriben en la base de datos, los servidores de Firebase escribirán una nueva marca de tiempo en función de su tiempo, en lugar de los clientes. Esto ayuda a resolver cualquier problema de consistencia de datos con diferentes zonas horarias del cliente:
firestore().doc('users/ABC').update({ createdAt: firestore.FieldValue.serverTimestamp(), });
Lea también: