【问题标题】:How to import collection and nested collection data in cloud firestore using node js?如何使用节点 js 在云 Firestore 中导入集合和嵌套集合数据?
【发布时间】:2020-08-29 07:33:40
【问题描述】:

如何使用node js在cloud firestore中导入集合和嵌套集合数据?

我使用此代码从 json 文件导入到 cloud firesore 数据库,但它仅在集合数据上导入

const admin = require('firebase-admin');
const serviceAccount = require("./servicekey.json");
const data = require("./data.json");
admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: "database-url";
});
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!",res);
                })
                .catch((error) => {
                    console.error("Error writing document: ", error);
                });
        });
    }
});

我的json文件格式这个文件可以有collecion和subcollectiondata或者嵌套的collection数据

{
     "messages2": {
     "1585135109814test": {
         "Ref_Chat_Type": 1,
         "Last_Content_Time": "1585135492165",
         "Member_Ids": ["xxx", "yyy"],
         "AdminUsers": ["yyy"],
         "Group_Desc": "Ttt",
         "Members": [{
             "User_Profile_Pic": null,
             "User_Id": "xxx",
             "User_Name": "vvv"
         }, {
             "User_Name": "sss",
             "User_Profile_Pic": "",
             "User_Id": "yyy"
         }, {
             "User_Name": "rrr",
             "User_Profile_Pic": "",
             "User_Id": "zzz"
         }],
         "Last_Content": "vhh",
         "Last_Content_From_Id": "yyy",
         "Group_Name": "Test",
         "Group_Id": "1585135109814test",
         "Last_Content_From_Username": "vvv",
         "Group_Pic": "",
         "subCollection": {
             "messages2/1585135109814test/1585135109814test": {
                 "0NBKTa2Py9HvRK0yNxLa": {
                     "Ref_Content_type": 1,
                     "Content_Timestamp": 1588673106,
                     "From_Id": "xxx",
                     "Content_Id": "0NBKTa2Py9HvRK0yNxLa",
                     "Group_Id": "1585135109814test",
                     "From_User_Profile_Pic": "",
                     "Content": "55",
                     "Content_Read_By": null,
                     "From_Username": "vvv"
                 }

         }
        }
    }
}
 }

我使用了批处理概念,这段代码出现了错误

C:\xampp\htdocs\task>node importmain.js

错误:

C:\xampp\htdocs\task\node_modules\firebase-admin\lib\firebase-namespace.js:101 抛出新的 error_1.FirebaseAppError(error_1.AppErrorCodes.NO_APP, errorMessage); ^

FirebaseAppError:默认 Firebase 应用不存在。确保 在使用任何 Firebase 服务之前调用 initializeApp()。 在 FirebaseAppError.FirebaseError [作为构造函数] (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\utils\error.js:42:28) 在 FirebaseAppError.PrefixedFirebaseError [作为构造函数] (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\utils\error.js:88:28) 在新的 FirebaseAppError (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\utils\error.js:122:28) 在 FirebaseNamespaceInternals.app (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:101:19) 在 FirebaseNamespace.app (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:402:30) 在 FirebaseNamespace.ensureApp (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:418:24) 在 FirebaseNamespace.fn (C:\xampp\htdocs\task\node_modules[4mfirebase-admin[24m\lib\firebase-namespace.js:327:30) 在对象。 (C:\xampp\htdocs\task\importmain.js:4:16) [90m at Module._compile (内部/模块/cjs/loader.js:776:30)[39m [90m at Object.Module._extensions..js (内部/模块/cjs/loader.js:787:10)[39m { errorInfo: { 代码:[32m'app/no-app'[39m, 消息:[32m'默认的 Firebase 应用不存在。确保在使用任何 Firebase 之前调用 initializeApp() services.'[39m }, codePrefix: [32m'app'[39m }

【问题讨论】:

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


    【解决方案1】:

    您不能通过调用 Firestore“文档写入方法”(例如 set()update()add())来写入文档及其子集合的文档。

    您需要合并多个调用。

    推荐的方式是使用批量写入,如下:

    const db = admin.firestore();
    let batch = db.batch();
    
    // Set the value of Parent
    var pRef = db.collection(key).doc(docTitle);
    batch.set(pRef, {...});
    
    // Set the value of Child
    var cRef = db.collection(key).doc(docTitle).collection("....").doc("...");
    batch.set(cRef, {...});
    
    // Commit the batch
    batch.commit().then(function () {
        // ...
    });
    

    因此,具体而言,您需要以生成文档/集合路径和相应的 JavaScript 对象的方式解析 json,以将其传递给批处理写入的 set() 方法。

    【讨论】:

    • 我使用批处理概念这个代码我来了一个错误 C:\xampp\htdocs\task\node_modules\firebase-admin\lib\firebase-namespace.js:101 throw new error_1.FirebaseAppError(error_1 .AppErrorCodes.NO_APP,错误消息); ^ FirebaseAppError:默认的 Firebase 应用不存在。确保在使用任何 Firebase 服务之前调用 initializeApp()。在 FirebaseAppError.FirebaseError [作为构造函数]
    • 没有批处理我执行程序数据来自firestore数据库上的非结构化
    【解决方案2】:

    问题在于firebase-admin 的初始化。

    根据documentation, 正确的语法如下:

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

    你应该不带任何参数调用admin.initializeApp()

    请尝试一下,让我知道它是否适合您。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2019-10-01
      • 1970-01-01
      • 2021-02-08
      相关资源
      最近更新 更多