【发布时间】:2018-12-27 07:39:11
【问题描述】:
昨天,我所有的 firebase 函数都开始抛出以下警告:
存储在 Firestore 中的 Date 对象的行为将会改变 您的应用程序可能会中断。隐藏此警告并确保您的应用确实如此 不中断,您需要先将以下代码添加到您的应用程序中 调用任何其他 Cloud Firestore 方法:
const firestore = new Firestore(); const settings = {/* your settings... */ timestampsInSnapshots: true}; firestore.settings(settings);通过此更改,将读取存储在 Cloud Firestore 中的时间戳 回到 Firebase Timestamp 对象而不是系统 Date 对象。 因此,您还需要更新期望 Date 的代码 期待一个时间戳。例如:
// Old: const date = snapshot.get('created_at'); // New: const timestamp = snapshot.get('created_at'); const date = timestamp.toDate();当您启用新的日期时,请审核所有现有的使用情况 行为。在未来的版本中,行为将更改为新的 行为,因此如果您不遵循这些步骤,您的应用程序可能会中断。
现在我想根据这个警告正确初始化我的 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 对象)。 所以我有两个问题:
如何初始化我的 Firestore 以获取设置对象?
当我在文档中插入日期或查询文档时,是否还需要传递 Firestore.Timestamp 对象?或者我可以查询/插入普通的 JS Date 对象,它会自动转换吗?
谢谢。
编辑:
我设法使用以下方法解决了 http 函数的问题:
if (!fireStoreDB){
fireStoreDB = admin.firestore();
fireStoreDB.settings(settings);
}
但它仍然发生在 Firestore 触发器上。 任何人都知道如何将默认设置提供给管理员:
admin.initializeApp(functions.config().firebase);
所以它不会发生在 Firestore 触发器上?
【问题讨论】:
-
我使用 JavaScript,而不是 TypeScript,
admin.firestore().settings(...)为我编译。你得到什么错误? -
“Firestore”类型上不存在属性“设置”
-
AFAIK Firestore 触发器使用由 Functions SDK 在内部初始化的单独 Firestore 客户端。此实例使用自己的设置,目前不包括 timestampInSnapshots 选项。
-
谢谢 Hiranya.... 所以对于目前反复发生的这个警告无所谓吗?
-
@ShaharWider,请看一下我的回答,因为在
firebase-adminv7.0.0 之后,针对此问题引入了一些重大更改。谢谢!
标签: firebase timestamp google-cloud-firestore google-cloud-functions firebase-admin