Импорт данных в Firestore с помощью Firebase Admin SDK (NodeJS) работает не для всех коллекций - PullRequest
0 голосов
/ 20 мая 2019

Я использую Firestore в качестве базы данных для моего веб-приложения React.Перед запуском тестов браузера с 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 голосов
/ 23 мая 2019

Хорошо, я решил эту проблему, создав продукт непосредственно как параметр функции .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);
      });
...