Как получить доступ к нескольким документам из Firestore в облачной функции - PullRequest
0 голосов
/ 08 января 2019

У меня есть облачная функция, которая запускается при записи документа. Облачная функция должна проверять несколько документов на основе триггера и выполнять операторы if / else.

Я создал функцию, которая обращается ко всем документам с помощью Promise.all, но эта ошибка возникает при попытке доступа ко всей информации о документе, если она еще не доступна.

    export function onTriggered(change, context) {
        const userPrevData = change.before.data();
        const userNewData  = change.after.data();

        const promises = [];

        // Get the uid
        const uid = context.params.userId;
        // User DocRef
        const userDoc        = firestoreInstance.collection('users').doc(uid).get();
        // User Session DocRef
        const userSessionDoc = firestoreInstance.collection('sessions').doc(uid).get();
        // Solution DocRef
        const solutionDoc    = firestoreInstance.collection('solution').doc('solutionId').get();

        promises.push(userDoc, userSessionDoc, solutionDoc);

        return Promise.all(promises).then((snapshots) => {
            // Use Promise.all with snapshot.docs.map to combine+return Promise context
            return Promise.all(snapshots.map((doc) => {
                // At this point, each document and their Ids print to the console.
                console.log('docId:::', doc.id);
                console.log('docData:::', doc.data());

                const solutionDocData = getSolutionDocData(doc);
                // This will print as 'undefined' until the correct document data is processed
                console.log('solutionDocData:::', solutionDocData);
                // This will print as 'undefined' until the correct document data is processed
                const clientSeed = doc.get('clientSeed');

                // Check to see if the Users' Guess is the same as the solution
                if (userNewData.guess.color === solutionDocData.guess.color && userNewData.guess.number === userNewData.guess.number) {
                    console.log('User solution is correct');
                }

            }));

        })
    }

    function getSolutionDocData(doc) {
        if (doc.id === 'solutionId') { return doc.data(); }
    }

Я ожидаю, что «Решение пользователя верное», если условие выполнено. Но я получаю ошибку, потому что данные не определены.

1 Ответ

0 голосов
/ 08 января 2019

Решением было переместить большую часть логики a .then ()

    return Promise.all(promises).then((snapshots) => {
        // Use Promise.all with snapshot.docs.map to combine+return Promise context
        return Promise.all(snapshots.map((doc) => {
            // At this point, each document and their Ids print to the console.
            console.log('docId:::', doc.id);
            console.log('docData:::', doc.data());

            return doc.data();
        })).then(data => { 
        console.log('data:::', data);

        let userDocDetails = {};
        let userSessionDocDetails = {};
        let solutionDocDetails = {};

        data.forEach(document => {
            if (document.uid === uid)           { userDocDetails = document }
            if (document.serverSeedEncrypted)   { userSessionDocDetails = document }
            if (document.solutionId)            { solutionDocDetails = document }
        });


        });

    })

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

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