昨天,我的所有firebase函数都开始抛出以下警告:
存储在Firestore中的Date对象的行为将发生变化,您的应用程序可能会发生变化。要隐藏此警告并确保您的应用不会中断,您需要在调用任何其他Cloud Firestore方法之前将以下代码添加到您的应用中:
const firestore = new Firestore(); const settings = {/* your settings... */ timestampsInSnapshots: true}; firestore.settings(settings);
通过此更改,存储在Cloud Firestore中的时间戳将作为Firebase Timestamp对象而不是系统Date对象读回。因此,您还需要更新期望日期的代码,而不是期望时间戳。例如:
// Old: const date = snapshot.get('created_at'); // New: const timestamp = snapshot.get('created_at'); const date = timestamp.toDate();
启用新行为时,请审核Date的所有现有用法。在将来的版本中,行为将更改为新行为,因此如果您不按照这些步骤操作,您的应用程序可能会突然发生。
现在我想根据此警告正确初始化我的firestore。我正在使用打字稿。
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对象)。所以我有两个问题:
谢谢。
编辑:
我设法使用以下方法为http函数解决它:
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
但它仍然发生在firestore触发器上。任何人都知道如何给管理员提供默认设置:
admin.initializeApp(functions.config().firebase);
所以它不会发生在firestore触发器上?
由于存在错误,您仍然收到JS Date而不是Firestore Timestamp ...现在已在Firebase Functions v2.0.2中修复。见:https://github.com/firebase/firebase-functions/releases/tag/v2.0.2。
对于初始化,我使用了警告消息中指定的admin.firestore().settings({timestampsInSnapshots: true})
,因此警告已消失。
向Document添加日期或用作查询参数时,可以使用普通的JS Date对象。
在index.js firebase函数文件中添加以下第二行代码
admin.initializeApp(functions.config().firebase);
admin.firestore().settings( { timestampsInSnapshots: true })
通过以下方式解决了它:
const settings = {timestampsInSnapshots: true};
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
对于firebase-admin
版本7.0.0或更高版本
你不应该再得到这个错误了。
在Version 7.0.0 - January 31, 2019的firebase-admin
中引入了一些breaking changes:
突破:
timestampsInSnapshots
默认值已更改为true。
timestampsInSnapshots
设置现在默认启用,因此从DocumentSnapshot
读取的时间戳字段将作为Timestamp
对象而不是Date
返回。任何期望接收Date
对象的代码都必须更新。
注意:如the official docs所述,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' })