web-dev-qa-db-fra.com

Firebase Firestore montrant l'avertissement

Je fais un projet avec Ionic 3 et firebase Firestore utilisé comme base de données.

Mais mon foyer à incendie affiche un avertissement chaque fois que je fais une opération CRUD.

 index.esm.js:77 [2018-05-02T05:45:40.408Z]  @firebase/firestore: 
 Firestore (4.13.0): 
 The behavior for Date objects stored in Firestore is going to change
 AND YOUR APP MAY BREAK.
 To hide this warning and ensure your app does not break, you need to 
 add the
 following code to your app before calling any other Cloud Firestore 
 methods:

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

 With this change, timestamps stored in Cloud Firestore will be read 
 back as
 Firebase Timestamp objects instead of as system Date objects. So you 
 will also
 need to update code expecting a Date to instead expect a Timestamp. 
 For example:

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

 Please audit all existing usages of Date when you enable the new 
 behavior. In a
 future release, the behavior will change to the new behavior, so if 
 you do not
 follow these steps, YOUR APP MAY BREAK.
3
pepe

J'ai ajouté le code ci-dessous dans app.module.ts, puis l'erreur est correcte.

firebase.initializeApp (environment.firebase) // Chargement des paramètres du serveur Firebase

firebase.firestore (). settings ({timestampsInSnapshots: true})

8
UMUT

Je viens de réinstaller "angularfire2". Il est déjà résolu à propos du problème.

informations de version: https://github.com/angular/angularfire2/releases

1
sangyong lee

Une fois que vous avez implémenté ce paramètre, les dates ne reviendront plus sous forme de dates JavaScript. Ce seront des timestamps Firestore. Votre code sera probablement touché. J'ai créé la fonction suivante pour convertir les propriétés d'horodatage d'un objet en propriétés Date javascript.

private convertFirestoreTimestampsToDates(myObject: any): void {
  for (let propertyName in myObject) {
    if (myObject.hasOwnProperty(propertyName)) {
      if (myObject[propertyName]) {
        if (myObject[propertyName].__proto__.constructor.name === 'Timestamp') myObject[propertyName] = myObject[propertyName].toDate();
      }
    }
  }
}
0
Richard Thompson

J'ai eu le même problème, si vous utilisez Angular et angularfire2 cela peut vous aider:

Comme l'indique l'avertissement, vous devez définir la propriété timestampsInSnapshots sur true lorsque votre application est lancée. Vous pouvez l'appeler dans le constructeur de AppComponent:

import { AngularFirestore } from 'angularfire2/firestore';

export class AppComponent {

    constructor(db: AngularFirestore) {
        const settings = { timestampsInSnapshots: true };
        db.app.firestore().settings(settings);   
    }

}

Pour éviter tout avertissement, vous pouvez définir le type de paramètres:

import { AngularFirestore } from 'angularfire2/firestore';
import * as firebase from 'firebase';

export class AppComponent {

    constructor(db: AngularFirestore) {
        const settings: firebase.firestore.Settings = { timestampsInSnapshots: true };
        db.app.firestore().settings(settings);   
    }

}

Le constructeur de AppModule est également un bon endroit pour appeler ce code, c'est à vous de choisir.

0
farkasnorbert90

Pour améliorer la réponse de 'farkasnorbert90' que j'ai utilisé afs.firestore.settings au lieu de db.app.firestore () dans app.component.ts

import * as firebase from 'firebase';
import { AngularFirestore } from 'angularfire2/firestore';

  constructor(
    public auth: AuthService,
    afs: AngularFirestore,
  ) {
    const settings: firebase.firestore.Settings = {
      timestampsInSnapshots: true,
    };
    afs.firestore.settings(settings);
  }
0
Axa Cheng