Firestore移至Firebase函数中的时间戳记

时间:2018-07-19 08:38:20

标签: firebase timestamp google-cloud-firestore google-cloud-functions firebase-admin

昨天,我所有的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();
     

启用新功能后,请审核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对象)。 所以我有两个问题:

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

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

谢谢。

编辑:

我设法使用

解决了http函数的问题
if (!fireStoreDB){
    fireStoreDB = admin.firestore();
    fireStoreDB.settings(settings);
}

但是它仍然在Firestore触发器上发生。 任何人都知道如何在上为管理员提供默认设置:

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

那么它不会在Firestore触发器上发生吗?

4 个答案:

答案 0 :(得分:11)

由于存在错误,您仍在接收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对象。

答案 1 :(得分:4)

在index.js firebase函数文件中的第二行代码下方添加

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

答案 2 :(得分:0)

通过以下方式解决了该问题:

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

答案 3 :(得分:0)

对于firebase-admin版本7.0.0或更高版本

您不应再收到此错误。

firebase-admin的{​​{3}}中引入了一些Version 7.0.0 - January 31, 2019

  

BREAKING:timestampsInSnapshots的默认设置已更改为true。

     

timestampsInSnapshots设置现已默认启用,因此时间戳记   从DocumentSnapshot读取的字段将作为Timestamp对象返回   而不是Date。任何期望接收Date对象的代码都必须是   已更新。

注意:如breaking changes中所述,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' })