Firestore将在Firebase函数中转换为时间戳

12

昨天,我所有的Firebase函数都开始抛出以下警告:

存储在Firestore中的日期对象的行为将发生改变,你的应用可能会受到影响。为了隐藏此警告并确保您的应用程序不会破裂,在调用任何其他Cloud Firestore方法之前,您需要将以下代码添加到您的应用程序中:

const firestore = new Firestore();
const settings = {/* your settings... */ timestampsInSnapshots: true};  
firestore.settings(settings);

通过这个更改,存储在云 Firestore 中的时间戳将作为 Firebase 时间戳对象而非系统日期对象读回。因此,您还需要更新期望日期对象的代码以便期望时间戳对象。例如:

// 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对象)。

所以我有两个问题:

  1. 如何初始化我的firestore以获取设置对象?

  2. 当我将日期插入文档或查询文档时,是否还需要传递Firestore.Timestamp对象?或者我可以查询/插入正常的JS Date对象,它会自动转换吗?

谢谢。

编辑:

我已经成功解决了http函数的问题:

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

但这仍然发生在Firestore触发器上。 有人知道如何为管理员提供默认设置吗:

但它仍然在Firestore触发器上发生。有人知道如何在管理员账户上设置默认值吗?

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

这样就不会在Firestore触发器上发生了吗?


我使用JavaScript而不是TypeScript,admin.firestore().settings(...) 对我来说可以编译。你遇到了什么错误? - Bob Snyder
类型 'Firestore' 上不存在属性 'settings'。 - Shahar Wider
4
据我所知,Firestore触发器使用由Functions SDK内部初始化的单独的Firestore客户端。该实例使用其自己的设置,目前不包括timestampInSnapshots选项。 - Hiranya Jayathilaka
1
谢谢Hiranya...所以目前关于这个一再发生的警告没有任何事情要做吗? - Shahar Wider
@ShaharWider,请看一下我的回答,因为在 firebase-admin v7.0.0 之后,有一些关于这个问题的重大变化。谢谢! - Yulian
4个回答

12
由于一个错误,你仍然收到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}),如警告信息所指定的那样,因此警告已经消失。
当你向一个文档添加日期或将其用作查询参数时,你可以使用普通的JS Date对象。

4
请在您的index.js Firebase函数文件中添加以下第2行代码。
admin.initializeApp(functions.config().firebase);  
admin.firestore().settings( { timestampsInSnapshots: true })

0

我是这样解决的:

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

0

对于firebase-admin版本7.0.0或以上

您不应该再收到此错误。

2019年1月31日的版本7.0.0中,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' })

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接