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.
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})
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
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();
}
}
}
}
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.
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);
}