nodejs Firestore突然中断:Date对象

时间:2018-07-17 22:21:59

标签: node.js firebase google-cloud-firestore

我运行一个简单的节点脚本来更新Firestore数据库中的数据。我几个小时前用过,效果很好。吃完饭,回来了,现在当我运行它时出现了这个错误:

node ./json-to-firestore.js 
  

Firestore中存储的Date对象的行为将改变   而且您的应用可能会崩溃。隐藏此警告并确保您的应用确实   不间断,您需要先在应用中添加以下代码   调用其他任何Cloud Firestore方法:

     

const firestore = new Firestore(); const设置= {/ *您的   设置... * / timestampsInSnapshots:true};
  firestore.settings(settings);

错误中提供的示例不适用于我的情况。我一直在寻求有关此问题的帮助,但所有帖子似乎都是针对特定角度的。这就是我要做的所有事情:

var admin = require("firebase-admin");

var serviceAccount = require("./service-key.json");

const data = require("./occ-firestore.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "xxxxxxxxxxx"
});

data && Object.keys(data).forEach(key => {
    const nestedContent = data[key];

    if (typeof nestedContent === "object") {
        Object.keys(nestedContent).forEach(docTitle => {
            admin.firestore()
                .collection(key)
                .doc(docTitle)
                .set(nestedContent[docTitle])
                .then((res) => {
                    console.log("Document successfully written!");
                })
                .catch((error) => {
                    console.error("Error writing document: ", error);
                });
        });
    }
});

我通过运行以下脚本来执行该脚本:

node ./json-to-firestore.js

我正在运行NodeJS 8.11.3。

我检查了Google's docs,但没有提及这种新行为。

有人可以给我一个建议吗?预先感谢!

3 个答案:

答案 0 :(得分:5)

可以这样修复:

const admin = require('firebase-admin');
const functions = require('firebase-functions');

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

const db = admin.firestore();
db.settings({ timestampsInSnapshots: true });

答案 1 :(得分:1)

我通过将Firebase版本降级为此来解决

{
  firebase-admin: "5.12.0",
  firebase-functions: "1.0.1"
}

答案 2 :(得分:0)

Firebase正在更改Date对象在Firestore中的存储方式。每当您尝试将Date对象保存到Firestore时,Bello便是来自他们的实际警告(在发布此答案之日):

  

Firestore中存储的Date对象的行为将改变   而且您的应用可能会崩溃。   要隐藏此警告并确保您的应用不会中断,您需要添加   在调用任何其他Cloud Firestore方法之前,将以下代码添加到您的应用中:

<Page.DataContext>

更重要的是,如何处理这些更改,以使您的代码不会中断:

  

进行此更改后,存储在Cloud Firestore中的时间戳将读为   Firebase时间戳对象,而不是作为系统日期对象。所以你也会   需要更新期望日期的代码而不是期望时间戳的代码。例如:

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