web-dev-qa-db-fra.com

Firestore passe aux horodatages dans les fonctions Firebase

Hier, toutes mes fonctions de base de feu ont commencé à lancer l'avertissement suivant:

Le comportement des objets Date stockés dans Firestore va changer ET VOTRE APP PEUT BRISER. Pour masquer cet avertissement et vous assurer que votre application le fait pas casser, vous devez ajouter le code suivant à votre application avant le appeler d'autres méthodes Cloud Firestore:

const firestore = new Firestore();
const settings = {/* your settings... */ timestampsInSnapshots: true};  
firestore.settings(settings);

Avec cette modification, les horodatages stockés dans Cloud Firestore seront lus de retour en tant qu’objets Firebase Timestamp au lieu d’objets Date système . Il vous faudra donc également mettre à jour le code en prévoyant une Date. attendre un horodatage. Par exemple:

// Old:   const date = snapshot.get('created_at');
// New:   const timestamp = snapshot.get('created_at');   const date =
timestamp.toDate();

Veuillez auditer toutes les utilisations existantes de Date lorsque vous activez le nouveau fichier comportement. Dans une version ultérieure, le comportement passera à la nouvelle comportement, donc si vous ne suivez pas ces étapes, votre application peut s’interrompre.

Maintenant, je veux initier correctement mon magasin de feu conformément à cet avertissement. J'utilise TypeScript.

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';    
admin.initializeApp(functions.config().firebase);
let fireStoreDB = fireStoreDB || admin.firestore()

le firestore () qui retourne de l'administrateur n'a pas de méthode .settings () comme décrit dans l'avertissement, ni obtient un objet dans le constructeur. (Il y a un objet App) . Alors j'ai deux questions:

  1. Comment init mon fireestore pour obtenir l'objet paramètres?

  2. quand j'insère une date dans un document ou interroge-t-il un document, dois-je également transmettre l'objet Firestore.Timestamp? ou puis-je interroger/insérer l'objet JS Date normal et il sera converti automatiquement?

Merci.

MODIFIER:

j'ai réussi à le résoudre pour les fonctions http en utilisant: 

if (!fireStoreDB){
    fireStoreDB = admin.firestore();
    fireStoreDB.settings(settings);
}

Mais cela se produit encore avec les déclencheurs Firestore ... Tout le monde sait comment donner les paramètres par défaut à admin sur:

admin.initializeApp(functions.config().firebase);

donc cela n'arrivera pas sur les déclencheurs de firestore?

6
Shahar Wider

Vous recevez toujours JS Date au lieu de Firestore Timestamp en raison d'un bogue ... maintenant corrigé dans Firebase Functions v2.0.2 . Voir: https://github.com/firebase/firebase-functions/releases/ tag/v2.0.2 .

Pour l'initialisation, j'ai utilisé admin.firestore().settings({timestampsInSnapshots: true}) comme spécifié dans le message d'avertissement. L'avertissement a donc disparu.

Lorsque vous ajoutez une date à un document ou utilisez un paramètre de requête, vous pouvez utiliser l'objet JS Date normal.

10
marcogramy

ajoutez ci-dessous le code de la deuxième ligne dans votre fichier de fonctions firebase index.js

admin.initializeApp(functions.config().firebase);  
admin.firestore().settings( { timestampsInSnapshots: true })
3
saigopi

résolu le problème de la manière suivante:

const settings = {timestampsInSnapshots: true}; 
if (!fireStoreDB){
    fireStoreDB = admin.firestore();
    fireStoreDB.settings(settings);
}
0
Shahar Wider