Цепочка Firebase Firestore документы / коллекции - PullRequest
1 голос
/ 22 июня 2019

Итак, у меня есть группа баз данных Firestore, вот так.

companies > acme-industries > items > [] OR collection > document > collection > document

enter image description here

Было бы лучше просто сохранить все элементы в базовой коллекции, а затем добавить строковое значение к каждому элементу, определяющее, к какой компании он относится? Тогда просто запросите коллекцию товаров для всех товаров, связанных с этой компанией?

Я пытаюсь получить элементы и запустить их через forEach в моей функции firebase. Я пробовал два разных подхода и смотрел несколько видео, но до сих пор не получил результатов.

Блок кода первой попытки

В результате возникла ошибка сервера 500 без объяснения причин.

const itemQuerySnapshot = db.collection('companies').doc(data.userData.company).collection('items').get();
const items: any = [];
itemQuerySnapshot.forEach((doc:any) => {
  console.log('doc', doc.data());
  items.push({
   id: doc.id,
   data: doc.data()
  });
});
response.json(items);

Блок кода второй попытки

В результате No Such Documents! возвращается

const itemRef = db.collection('companies').doc(data.userData.company).collection('items');
itemRef.get().then((doc:any) => {
    if(!doc.exists) {
        response.send('No such documents!');
    } else {
        response.send('Document Data: '+ doc.data());
    }
}).catch((err:any) => {
    response.status(500).send(err);
});

Я ожидаю что-то вроде массива всех элементов, которые будут возвращены из этого вызова. Я совершенно новичок в Firebase Firestore, что мне здесь не хватает?

UPDATE

Я заменил свой код на блок кода третьей попытки и добился успеха с console.log(doc.data()). Тем не менее, объект items по-прежнему возвращается пустым. Это потому, что он возвращается до того, как для каждого сделано? Если это так, как вы могли бы предотвратить это, чтобы гарантировать, что каждый элемент, который должен быть возвращен, является

const items: any = [];
const userRef = db.collection("companies").doc(data.userData.company);
const itemsRef = userRef.collection("items");
itemsRef
  .get()
  .then((snapshot: any) => {
    snapshot.forEach((doc: any) => {
      console.log(doc.data());
      items.push({
        id: doc.id,
        data: doc.data()
      });
    });
  })
  .catch((err: any) => {
    response.status(500).send(err);
  });
response.json(items);

Как бы вы добавили еще один документ в список? Скажем, вы хотите получить один предмет. Как бы Вы это сделали? Следующее всегда приводит к возвращению Item does not exist из моей функции.

const companyRef = db.collection('companies').doc(data.userData.company);

const itemRef = companyRef.collection('items');

const item = itemRef.where('number', '==', itemSku).get();

Я, должно быть, делаю что-то невероятно неправильное, потому что все видео говорят мне, что невероятно легко получить данные из Firestore. Но я еще не видел этого.

1 Ответ

1 голос
/ 22 июня 2019

get возвращает Обещание, обратный вызов функции then будет вызван, как только данные будут готовы из пожарного хранилища.

будет вызвана строка response.json(items); до правильного сбора массива элементов.

вам нужно переместить эту строку внутри then обратного вызова

оформить заказ:

.then((snapshot: any) => {
    snapshot.forEach((doc: any) => {
        console.log(doc.data());
        items.push({
            id: doc.id,
            data: doc.data()
        });
    });

    response.json(items);    //items ARRAY IS READY , YOU CAN SEND YOUR RESPONSE HERE 
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...