Не работает в подсобном подразделении Firestore Sub Collection - PullRequest
0 голосов
/ 20 января 2020

Приведенный ниже код работает, как ожидается, в нашем проекте Firebase, но не даст никаких результатов в нашем производственном проекте. Функции, триггеры, структуры документов, индексы кажутся идентичными для обоих проектов. Мы должны упустить что-то маленькое.

Запрос Firestore, который имеет проблему с загрузкой всех существующих документов в под-коллекции "module2Attempts", находится здесь:

admin.firestore().collection("users").doc("jcGP0aE2RSf0f0vmR15LGa6QNIu1").collection("module2Attempts")
    .get()
    .then(function (docs) {
      if (docs.empty) {
        console.log("No docs found from query.");
        return [];
      }
      let prevAttempts = [];
      docs.docs.forEach(function (doc) {
        // doc.data() is never undefined for query doc snapshots
        prevAttempts.push(doc.data());
      });
      console.log(prevAttempts.length+" attempts found!");
      return prevAttempts;
    })
    .catch(function (error) {
      console.error("Error loading module 2 attempt docs: ", error);
    });
}

Мы подтвердили data.uid не нулевое или неопределенное, и существует несколько документов по пути сбора, определенному запросом.

functions / index. js

'use strict';
const functions = require('firebase-functions');
const admin = require('firebase-admin');

const prodServiceAccount = require("./prodServiceAccountKey.json");
const devServiceAccount = require("./devServiceAccountKey.json");

const config = process.env.REACT_APP_STAGE === "prod" ?
  {
    credential: admin.credential.cert(prodServiceAccount),
    databaseURL: "https://...."
  } :
  {
    credential: admin.credential.cert(devServiceAccount),
    databaseURL: "https://..."
  };

admin.initializeApp(config);

const onCreateModule2Attempt = require('./Modules/onCreateModule2Attempt.js');


// Listen for new module2Attempt docs created
module.exports.createModule2Attempt = functions.firestore
  .document('users/{userId}/module2Attempts/{attemptId}')
  .onCreate(onCreateModule2Attempt.handler);

onCreateModule2Attempt. js

const admin = require('firebase-admin');


exports.handler = async (snap, context) => {
  const data = snap.data();
  console.log("This log is just a test balloon")
  console.log("New Module 2 Attempt for ", data.email);

  admin.firestore().collection("users").doc("jcGP0aE2RSf0f0vmR15LGa6QNIu1").collection("module2Attempts")
    .get()
    .then(function (docs) {
      if (docs.empty) {
        console.log("No docs found from query.");
        return [];
      }
      let prevAttempts = [];
      docs.docs.forEach(function (doc) {
        // doc.data() is never undefined for query doc snapshots
        prevAttempts.push(doc.data());
      });
      console.log(prevAttempts.length+" attempts found!");
      return prevAttempts;
    })
    .catch(function (error) {
      console.error("Error loading module 2 attempt docs: ", error);
    });
}

1 Ответ

1 голос
/ 21 января 2020

exports.handler не возвращает обещание, которое разрешается, когда вся работа завершена. Это требование от Cloud Functions, поэтому оно знает, когда безопасно убирать свою работу. Если это работает иногда, а не другие, то, что вы наблюдаете, это состояние гонки.

Минимально, что вы должны делать, это:

return admin.firestore().collection("users").doc().collection().get()...

Обратите внимание на оператор return.

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