【问题标题】:Firestore moving to timestamps in Firebase functionsFirestore 移至 Firebase 函数中的时间戳
【发布时间】: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 对象)。 所以我有两个问题:

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

  2. 当我在文档中插入日期或查询文档时,是否还需要传递 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-admin v7.0.0 之后,针对此问题引入了一些重大更改。谢谢!

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


【解决方案1】:

适用于firebase-admin 7.0.0 或以上版本

您应该不会再收到此错误。

Version 7.0.0 - January 31, 2019firebase-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' })

【讨论】:

    【解决方案2】:

    通过以下方式解决:

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

    【讨论】:

      【解决方案3】:

      在您的 index.js firebase 函数文件中添加以下第 2 行代码

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

      【讨论】:

        【解决方案4】:

        由于一个错误,您仍会收到 JS 日期而不是 Firestore 时间戳...现已在 Firebase Functions v2.0.2 中修复。 请参阅:https://github.com/firebase/firebase-functions/releases/tag/v2.0.2

        对于初始化,我使用了警告消息中指定的admin.firestore().settings({timestampsInSnapshots: true}),因此警告消失了。

        当你在Document中添加日期,或者作为查询参数使用时,可以使用普通的JS Date对象。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-09-25
          • 2020-02-28
          • 2019-03-22
          • 1970-01-01
          • 2020-10-24
          • 2020-04-17
          相关资源
          最近更新 更多