使用Firebase Admin SDK(NodeJS)将数据导入Firestore不适用于所有集合

时间:2019-05-20 18:54:18

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

我将Firestore用作我的React Web应用程序的数据库。在运行使用cypress的浏览器测试之前,我执行一个NodeJS脚本,该脚本导入那些测试所需的数据。我的Firebase计划设置为Blaze(即付即用),因为免费版本不支持导入。

我有3个收集数据的地方-组织,配置文件,产品。 使用相同的代码,导入适用于组织和个人资料,但不适用于产品

const admin = require("firebase-admin");
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: `https://<myFirebaseProjectId>.firebaseio.com`
});

const testOrg = {
  name: "testOrgName",
  createdAt: Date()
};

//add organization
admin.firestore().collection("organizations").add(testOrg)
  .then(createdTestOrg => {
     //works fine with organizations
     console.log("Successfully created new org:", createdTestOrg.id);
     const testProfile = {
       name: "testProfile",
       organization: admin.firestore().doc(`organizations/${createdTestOrg.id}`)       
       createdAt: Date()
     };

     //add profiles
     admin.firestore().collection("profiles").add(testprofile)
     .then(createdTestProfile => {
        //works fine with profile
        console.log("Successfully created new profile:", createdTestProfile .id);

       let productItem = {
         isDeleted: false,
         createdBy: admin.firestore().doc('profiles/' + selectedUser[0].uid),
         createdAt: Date()
       };            
       productItem.name = makeRandomName(10)

       //add product
       admin.firestore().collection("products").add(productItem)
       .then((newProd)=>{
          // I never get here
          console.log("Successfully created test product");
       })
      .catch(error => {
         // I never get here either
         // eslint-disable-next-line no-console
         console.log("Error creating test product:", error);
         process.exit(1);
       });
     });
  });

以下是完整内容的要点:https://gist.github.com/DurkoMatko/1097d1c18a00d5fd4195253205c53ff2

我还尝试将collection("products").add(product)替换为collection("products").doc(product.id).set(product),如果尚不存在,则会创建新文档。仍然没有成功。此外,.then和。catch部分中的断点均不会触发。这些行只是默默地发生,但是没有创建新产品文档。

有人请问吗?

1 个答案:

答案 0 :(得分:0)

好的,我已经解决了这一问题,直接将产品创建为.add函数的参数,而不是在将其传递给const之前将其存储为.add变量。我不知道为什么这行得通,而我在问题中发布的代码却不行。希望它对以后的人有所帮助。

 admin
    .firestore()
    .collection("products")
    .add({ 
        name: "BrowserTestProduct26",
        createdAt: Date.now(),
        createdBy: admin.firestore().doc(`profiles/${userRecord.uid}`),
        isDeleted: false,
        category: categories[Math.floor(Math.random() * categories.length)]
     })
     .then(createdProduct => {
        console.log("Successfully created new product:", createdProduct.id);
     })
     .catch(error => {
        console.log("Error creating test product:", error);
        process.exit(1);
      });