昨日、すべてのfirebase機能が次の警告をスローし始めました。
Firestoreに保存されているDateオブジェクトの動作が変更され、アプリが壊れる可能性があります。この警告を非表示にしてアプリが破損しないようにするには、他のCloud Firestoreメソッドを呼び出す前に、アプリに次のコードを追加する必要があります。
const firestore = new Firestore(); const settings = {/* your settings... */ timestampsInSnapshots: true}; firestore.settings(settings);
この変更により、Cloud Firestoreに保存されたタイムスタンプは、システムのDateオブジェクトとしてではなく、Firebase Timestampオブジェクトとして読み返されます。そのため、日付を期待するコードを更新する代わりに、タイムスタンプを期待する必要があります。例えば:
// Old: const date = snapshot.get('created_at'); // New: const timestamp = snapshot.get('created_at'); const date = timestamp.toDate();
新しい動作を有効にするときは、Dateの既存の使用をすべて監査してください。将来のリリースでは、動作が新しい動作に変更されるため、これらの手順に従わないと、アプリが中断する可能性があります。
次に、この警告に従って、Firestoreを正しく初期化します。 TypeScriptを使用しています。
import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';
admin.initializeApp(functions.config().firebase);
let fireStoreDB = fireStoreDB || admin.firestore()
adminから戻るfirestore()には、警告で説明されている.settings()メソッドがなく、コンストラクターでオブジェクトを取得しません。 (Appオブジェクトを取得します)。だから私は2つの質問があります:
Firestoreを初期化して設定オブジェクトを取得するにはどうすればよいですか?
ドキュメントに日付を挿入するとき、またはドキュメントを照会するときに、Firestore.Timestampオブジェクトも渡す必要がありますか?または、通常のJS Dateオブジェクトを照会/挿入できますか?それは自動的に変換されますか?
ありがとう。
編集:
私はhttp関数を使用してそれを解決することができました:
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
ただし、Firestoreトリガーではまだ発生しています。誰でも管理者にデフォルト設定を与える方法を知っています:
admin.initializeApp(functions.config().firebase);
ファイアーストアのトリガーでは発生しませんか?
バグにより、Firestore TimestampではなくJS Dateを受け取ります。FirebaseFunctions v2.0.2で修正されました。参照: https://github.com/firebase/firebase-functions/releases/tag/v2.0.2 .
初期化には、警告メッセージで指定されているadmin.firestore().settings({timestampsInSnapshots: true})
を使用したため、警告は消えました。
ドキュメントに日付を追加するとき、またはクエリパラメーターとして使用するときは、通常のJS Dateオブジェクトを使用できます。
index.js firebase関数ファイルの2行目のコードの下に追加します
admin.initializeApp(functions.config().firebase);
admin.firestore().settings( { timestampsInSnapshots: true })
次の方法で解決しました:
const settings = {timestampsInSnapshots: true};
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
For firebase-admin
バージョン7.0.0以上
このエラーはもう発生しないはずです。
バージョン7.0.0-2019年1月31日 of firebase-admin
いくつかの 重大な変更 が導入されました:
BREAKING:
timestampsInSnapshots
のデフォルトがtrueに変更されました。
timestampsInSnapshots
設定がデフォルトで有効になったため、DocumentSnapshot
から読み取られたタイムスタンプフィールドは、Timestamp
ではなくDate
オブジェクトとして返されます。Date
オブジェクトを受け取ると予想されるコードはすべて更新する必要があります。
注:公式ドキュメント で述べたように、timestampsInSnapshots
は将来のリリースで削除される予定です。必ず完全に削除してください。
古いバージョンのfirebase-admin
(6.5.1以下)
これは仕事をするはずです:
const admin = require('firebase-admin');
admin.initializeApp();
const firestore = admin.firestore();
// Add this magical line of code:
firestore.settings({ timestampsInSnapshots: true });
次に、関数でfirestoreオブジェクトを直接使用します。
firestore.doc(`/mycollection/${id}`).set({ it: 'works' })