выборка нескольких данных с использованием firebase / firestore на стороне сервера (nextjs / apiRoutes) = проблема => вывод до того, как данные будут готовы - PullRequest
0 голосов
/ 08 февраля 2020

результат [] будет выполнен до того, как данные будут готовы. Я даже пытался решить проблему с обещанием, но тоже не удалось ..

import { firestore } from "../../../firebase";

export default (req, res) => {
  firestore
    .collection("category-filters")
    .where(req.query.categoryKey, "==", true)
    .get()
    .then(querySnapshot => {
      let result = [];

      querySnapshot.docs.map(doc => {
        firestore
          .collection("payment-accounts")
          .doc(doc.id)
          .get()
          .then(item => {
            if (item.data().creditAmount > 0) {
              firestore
                .collection("professional-profiles")
                .doc(item.id)
                .get()
                .then(endresult => {
                  result.push({ id: endresult.id, ...endresult.data() }); // executes successful
                });
            }
          });
      });

      res.json({ result }); // the data is outputted before the "querySnapshot.docs.map" is executed...
      // therefore received a blank array (result)
    });
};

1 Ответ

2 голосов
/ 08 февраля 2020

Должно работать следующее (не проверено):

export default (req, res) => {
    firestore
        .collection("category-filters")
        .where(req.query.categoryKey, "==", true)
        .get()
        .then(querySnapshot => {

            const promises = [];
            const paymentAccountsRef = firestore.collection("payment-accounts");

            querySnapshot.docs.map(doc => {
                promises.push(paymentAccountsRef.doc(doc.id).get());
            });

            return Promise.all(promises);

        })
        .then(paymentAccountsSnapshotsArray => {

            const promises = [];
            const professionalProfilesRef = firestore.collection("professional-profiles");

            paymentAccountsSnapshotsArray.forEach(snap => {
                if (snap.data().creditAmount > 0) {
                    promises.push(professionalProfilesRef.doc(snap.id).get());
                }
            });

            return Promise.all(promises);

        })
        .then(professionalProfileSnapshotsArray => {

            const results = [];

            professionalProfileSnapshotsArray.forEach(snap => {
                results.push({ id: snap.id, ...snap.data() });
            });

            res.json({ results });

        })
};

Вам необходимо управлять параллельными выборками документов с помощью Promise.all() и связывать различные Обещания, возвращаемые Promise.all(), в порядке отправлять ответ только тогда, когда все эти асинхронные операции завершены. В вашем текущем коде вы отправляете ответ до того, как эти асинхронные операции завершены.


Кроме того, вам может потребоваться точная настройка этого кода, чтобы проверить, что различные снимки Массивы не пусты. Эта часть зависит от вас!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...