Node.js nodejs Firestore突然中断:日期对象

Node.js nodejs Firestore突然中断:日期对象,node.js,firebase,google-cloud-firestore,Node.js,Firebase,Google Cloud Firestore,我运行了一个简单的节点脚本来更新Firestore数据库中的数据。我几个小时前用过,效果很好。吃过晚饭回来了,现在我运行它时出错了: node ./json-to-firestore.js Firestore中存储的日期对象的行为将发生更改 你的应用程序可能会崩溃。隐藏此警告并确保您的应用程序 不中断,您需要在之前将以下代码添加到您的应用程序中 调用任何其他云Firestore方法: const firestore=新的firestore();常量设置={/*您的 设置…*/timestam

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

node ./json-to-firestore.js 
Firestore中存储的日期对象的行为将发生更改 你的应用程序可能会崩溃。隐藏此警告并确保您的应用程序 不中断,您需要在之前将以下代码添加到您的应用程序中 调用任何其他云Firestore方法:

const firestore=新的firestore();常量设置={/*您的 设置…*/timestampsInSnapshots:true}
firestore.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
我正在运行nodejs8.11.3

我查过了,没有提到这种新的行为


有人能给我提个建议吗?提前谢谢

我通过将firebase版本降级到该版本来解决此问题

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

我通过将firebase版本降级到该版本来解决此问题

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

这可以通过以下方式进行固定:

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

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

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

这可以通过以下方式进行固定:

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

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

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

Firebase正在更改日期对象在Firestore中的存储方式。当您试图将日期对象保存到Firestore时(在发布此答案之日),下面是他们发出的实际警告:

Firestore中存储的日期对象的行为将发生更改 你的应用程序可能会崩溃。 要隐藏此警告并确保应用程序不会中断,您需要添加 在调用任何其他云Firestore方法之前,请将以下代码添加到您的应用程序:

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

通过此更改,存储在CloudFireStore中的时间戳将作为 Firebase时间戳对象,而不是系统日期对象。所以你也会 需要更新预期日期的代码,而不是预期时间戳。例如:


Firebase正在更改日期对象在Firestore中的存储方式。当您试图将日期对象保存到Firestore时(在发布此答案之日),下面是他们发出的实际警告:

Firestore中存储的日期对象的行为将发生更改 你的应用程序可能会崩溃。 要隐藏此警告并确保应用程序不会中断,您需要添加 在调用任何其他云Firestore方法之前,请将以下代码添加到您的应用程序:

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

通过此更改,存储在CloudFireStore中的时间戳将作为 Firebase时间戳对象,而不是系统日期对象。所以你也会 需要更新预期日期的代码,而不是预期时间戳。例如:


这种变化已经存在了相当长的一段时间。也许您最近更新了客户端库?不管怎样,这个建议出现在错误消息中-非常清楚。我想这个错误是从firebase admin 5.13.0开始抛出的,我也收到了@谢谢你的评论。我同意这条信息很清楚,但我在翻译他们的建议以便在我的代码中使用时遇到了困难。这就是问题所在。。。它出错了,没有执行。我的代码与日期无关,所以我不清楚为什么会失败。如果这只是一个无伤大雅的警告,我不会担心。这种变化已经存在了相当长的一段时间。也许您最近更新了客户端库?不管怎样,这个建议出现在错误消息中-非常清楚。我想这个错误是从firebase admin 5.13.0开始抛出的,我也收到了@谢谢你的评论。我同意这条信息很清楚,但我在翻译他们的建议以便在我的代码中使用时遇到了困难。这就是问题所在。。。它出错了,没有执行。我的代码与日期无关,所以我不清楚为什么会失败。如果这只是一个无害的警告,我就不会担心了。事实上,这是有效的。。。但这似乎更像是一种变通办法,而不是解决方案。我希望最终能够更新到当前版本。但现在,它正在发挥作用。非常感谢。事实上,这起作用了。。。但这似乎更像是一种变通办法,而不是解决方案。我希望最终能够更新到当前版本。但现在,它正在发挥作用。非常感谢。当我使用“admin.initializeApp({credential:admin.credential.cert(serviceAccount)})”时,它对我起了作用而不是“admin.initializeApp(functions.config().firebase);”根据Firebase文档(),这取决于您是从哪个位置连接到Firebase的。”admin.initializeApp({credential:admin.credential.cert(serviceAccount)});'如果从您自己的服务器进行连接,则此选项是正确的,因为您正在运行Firebase功能,因此无需执行此操作。您可以在我上面的回答中使用这个例子。当我使用“admin.initializeApp({credential:admin.credential.cert(servicecomport)})”时,它对我很有效而不是“admin.initializeApp(functions.config().firebase);”根据Firebase文档(),这取决于您是从哪个位置连接到Firebase的。”admin.initializeApp({credential:admin.credential.cert(serviceAccount)});'如果从您自己的服务器进行连接,则此选项是正确的,因为您正在运行Firebase功能,因此无需执行此操作。你可以用我上面回答的例子。