昨天,我所有的Firebase函数都开始抛出以下警告:
存储在Firestore中的日期对象的行为将发生改变,你的应用可能会受到影响。为了隐藏此警告并确保您的应用程序不会破裂,在调用任何其他Cloud Firestore方法之前,您需要将以下代码添加到您的应用程序中:
const firestore = new Firestore(); const settings = {/* your settings... */ timestampsInSnapshots: true}; firestore.settings(settings);
通过这个更改,存储在云 Firestore 中的时间戳将作为 Firebase 时间戳对象而非系统日期对象读回。因此,您还需要更新期望日期对象的代码以便期望时间戳对象。例如:
请在启用新行为时审核所有现有Date的使用情况。在未来的版本中,该行为将更改为新行为,因此如果您不遵循这些步骤,您的应用程序可能会崩溃。
// Old: const date = snapshot.get('created_at'); // New: const timestamp = snapshot.get('created_at'); const date = timestamp.toDate();
现在我想根据此警告正确初始化我的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对象)。
所以我有两个问题:
如何初始化我的firestore以获取设置对象?
当我将日期插入文档或查询文档时,是否还需要传递Firestore.Timestamp对象?或者我可以查询/插入正常的JS Date对象,它会自动转换吗?
谢谢。
编辑:
我已经成功解决了http函数的问题:
if (!fireStoreDB){ fireStoreDB = admin.firestore(); fireStoreDB.settings(settings); }
但这仍然发生在Firestore触发器上。 有人知道如何为管理员提供默认设置吗:
但它仍然在Firestore触发器上发生。有人知道如何在管理员账户上设置默认值吗?
admin.initializeApp(functions.config().firebase);
这样就不会在Firestore触发器上发生了吗?
admin.firestore().settings(...)
对我来说可以编译。你遇到了什么错误? - Bob Snyderfirebase-admin
v7.0.0 之后,有一些关于这个问题的重大变化。谢谢! - Yulian