node.js - trigger - firebase functions example
¿Cómo obtengo la marca de tiempo del servidor en Cloud Functions para Firebase? (4)
Sé que puede extraer la marca de tiempo del servidor en web, iOS y Android, pero ¿qué pasa con las nuevas funciones de nube para Firebase? No puedo averiguar cómo obtener la marca de tiempo del servidor allí? Caso de uso es que quiero marcar la hora de un correo electrónico cuando llega.
En la web es Firebase.database.ServerValue.TIMESTAMP
¿Pero eso no parece estar disponible en la interfaz del servidor del nodo de funciones?
Creo que es tarde y puede que me esté perdiendo el punto aquí ...
EDITAR
Estoy inicializando asi
admin.initializeApp(functions.config().firebase);
const fb = admin.database()
Entonces, se llama así ...
Firebase.database.ServerValue.TIMESTAMP
Pero, eso es de una integración del lado del cliente. En Funciones, Firebase no se inicializa de esta manera. He intentado
admin.database().ServerValue.TIMESTAMP
y
fb.ServerValue.TIMESTAMP
Como ya estás usando el SDK de administración, la sintaxis correcta es:
admin.database.ServerValue.TIMESTAMP
Si usa Firebase Admin SDK, aquí tiene la sintaxis correcta (verificada 2017-12-07):
const admin = require(''firebase-admin'');
// or
// import * as admin from ''firebase-admin'';
// Using Cloud Firestore
admin.firestore.FieldValue.serverTimestamp()
// Using Realtime Database
admin.database.ServerValue.TIMESTAMP
Solo para aclarar para futuros lectores:
admin.database.ServerValue.TIMESTAMP
devuelve un objeto non-null Object
y es un valor de marcador de posición para completar automáticamente la marca de tiempo actual. No contiene la marca de tiempo real. La base de datos reemplazará este marcador de posición cuando ejecutará el comando.
Si lo está utilizando dentro de una database.ref
datos.ref, entonces funciona como usted espera y es la forma preferida de ingresar una marca de tiempo:
var sessionsRef = firebase.database().ref("sessions");
sessionsRef.push({
startedAt: firebase.database.ServerValue.TIMESTAMP // this will write ''startedAt: 1537806936331`
});
Pero si intenta usarlo fuera de la función de la base de datos (por ejemplo, para devolver el tiempo ahora o hacer algunos cálculos), devolverá un objeto que no puede usar:
console.log(firebase.database.ServerValue.TIMESTAMP) // this will return an [object Object]
Vea más sobre esto en firebase.database.ServerValue y en esta pregunta SO .
Date.now()
funciona bien fuera de una función de database
si desea usarlo para un cálculo o cualquier otro uso general.
console.log(Date.now()); // this will return 1537806936331
Ambos utilizan un unix time
que es el número de segundos que han transcurrido desde las 00:00:00, hora universal coordinada (UTC), jueves 1 de enero de 1970, y es irrelevante desde la zona horaria. Es el mismo número en el cliente y en el servidor (... o casi :-). Ver el tiempo de Unix .
Soy nuevo en node.js, pero Date.now() funciona en mis pruebas.
Editar
Entendí mal tu pregunta, no me di cuenta de que querías marcar los datos que estabas almacenando en la base de datos de Firebase. Pensé que simplemente quería tener tiempo en el servidor que ejecutaba su función de nube. Si desea marcar la hora de un correo electrónico recibido almacenado en la base de datos de Firebase, entonces usar admin.database.ServerValue.TIMESTAMP
es sin duda el mejor enfoque.
Solo para mi propia educación, escribí la siguiente función para ver cómo se comparan los tiempos. Espero que los tiempos en el servidor de funciones en la nube y en el servidor de bases de datos estén sincronizados con una referencia de tiempo muy precisa. Cuando ejecuto esta función, la marca de tiempo de la base de datos generalmente se encuentra dentro de cien milisegundos del valor de Date.now()
. El hecho de que la base de datos de la base de datos sea un poco más tarde es razonable, dado que la función de la nube tarda un poco en conectarse y realizar la escritura.
exports.timeTest = functions.database.ref(''/test/trigger'')
.onWrite(event => {
const now= Date.now();
console.log(''now='', now);
const timeVals = {
dateNow : now,
serverTimestamp : admin.database.ServerValue.TIMESTAMP
};
return event.data.ref.parent.child(''times'').update(timeVals);
});