web-dev-qa-db-ja.com

Firebase関数のタイムスタンプに移動するFirestore

昨日、すべての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つの質問があります:

  1. Firestoreを初期化して設定オブジェクトを取得するにはどうすればよいですか?

  2. ドキュメントに日付を挿入するとき、またはドキュメントを照会するときに、Firestore.Timestampオブジェクトも渡す必要がありますか?または、通常のJS Dateオブジェクトを照会/挿入できますか?それは自動的に変換されますか?

ありがとう。

編集:

私はhttp関数を使用してそれを解決することができました:

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

ただし、Firestoreトリガーではまだ発生しています。誰でも管理者にデフォルト設定を与える方法を知っています:

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

ファイアーストアのトリガーでは発生しませんか?

10
Shahar Wider

バグにより、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オブジェクトを使用できます。

11
marcogramy

index.js firebase関数ファイルの2行目のコードの下に追加します

admin.initializeApp(functions.config().firebase);  
admin.firestore().settings( { timestampsInSnapshots: true })
4
Sai Gopi N

次の方法で解決しました:

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

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' })
0
Yulian