Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在云功能中从Firestore访问多个文档_Javascript_Angular_Firebase_Google Cloud Firestore_Google Cloud Functions - Fatal编程技术网

Javascript 如何在云功能中从Firestore访问多个文档

Javascript 如何在云功能中从Firestore访问多个文档,javascript,angular,firebase,google-cloud-firestore,google-cloud-functions,Javascript,Angular,Firebase,Google Cloud Firestore,Google Cloud Functions,我有一个在文档写入时触发的云函数。云函数需要根据触发器检查多个文档,并执行if/else语句 我创建了一个函数,该函数使用Promise.all访问所有文档,但如果还不可用,则在尝试访问所有文档信息时会出错 export function onTriggered(change, context) { const userPrevData = change.before.data(); const userNewData = change.after.da

我有一个在文档写入时触发的云函数。云函数需要根据触发器检查多个文档,并执行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(); }
    }

如果满足条件,我希望“用户解决方案是正确的”。但是,我得到一个错误,因为数据未定义。

解决方案是移动大部分逻辑a。然后()


我不确定数据是否总是按照原始promise数组的顺序返回,因此我使用forEach语句来标识唯一属性并相应地分配它们。

getSolutionDocData将在您向其传递id不是“solutionId”的文档时返回未定义的数据。这里没有足够的信息来理解这是否正确。@DougStevenson正如你所指出的,我也提到过,当信息不可用时,信息是未定义的。然而,问题中有足够的信息。解决方案是将逻辑移到.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 }
        });


        });

    })