首页 > 解决方案 > Firebase 云功能:使用事务更新函数中的代码后出现“无法获取默认凭据”错误

问题描述

这是我写的云函数的作用:

  1. 收听“用户”集合中的更新。
  2. 获取多个集合中的所有相关文档。
  3. 使用事务相应地更新文档。

为了获得每个事务大约 500 个文档写入限制,我更新了代码以将文档分成多个批次并为每个批次运行事务。但是,当我运行更新的函数时,我得到以下错误,对于以前版本的函数我根本没有得到:

错误信息

我做了一些研究,但无法弄清楚为什么会发生错误。有人可以帮我解决这个问题吗?

以下是更新前的代码和更新后的代码:

更新前:

    exports.userInfoUpdate = functions.firestore.document('users/{userid}').onUpdate((change,context) => {
        const olduserinfo=change.before.data();
        const newuserinfo=change.after.data();

        const q1 = db.collection('reco').where('reco_users','array-contains', olduserinfo);
        const q2 = db.collection('comments').where('userinfo', '==', olduserinfo);
        const q3 = db.collection('posts').where('userinfo', '==', olduserinfo);
        const q4 = db.collection('subscribing').where('subs_users','array-contains', olduserinfo);

        return Promise.all([q1.get(), q2.get(), q3.get(), q4.get()])
        .then(results => {
            refs = [];
            results.forEach(querySnapshot => {
                querySnapshot.forEach(documentSnapshot => {
                    refs.push(documentSnapshot.ref);
                })
            });
            if (refs.length===0){
                console.log('no changes needed');
                return null;
            }
                return db.runTransaction(t => {
                    return t.getAll(...refs)
                        .then(docs => {
                            docs.forEach(doc => {
                                switch (doc.ref.path.split('/')[0]) {
                                case 'reco':
                                    const recodata=doc.data().reco_users;
                                    const newrecodata=recodata.map((dt)=>{return dt.uid===olduserinfo.uid ? newuserinfo : dt});
                                    t = t.set(doc.ref, {reco_users:newrecodata})
                                break;
                                case 'subscribing':
                                    const subsuser=doc.data().subs_users;
                                    const subsuid=doc.data().subs_users_uid;
                                    const newsubs=subsuser.map((sb)=>{return sb.uid===olduserinfo.uid ? newuserinfo : sb});
                                    t = t.set(doc.ref,{subs_users:newsubs, subs_users_uid:subsuid})
                                break;
                                default:
                                    t = t.update(doc.ref, { userinfo: newuserinfo })
                                }
                            })
                        })
                })
        })
    })

更新后(导致凭据错误的那个):

    exports.userInfoUpdate = functions.firestore.document('users/{userid}').onUpdate((change,context) => {
        const olduserinfo=change.before.data();
        const newuserinfo=change.after.data();

        const q1 = db.collection('reco').where('reco_users','array-contains', olduserinfo);
        const q2 = db.collection('comments').where('userinfo', '==', olduserinfo);
        const q3 = db.collection('posts').where('userinfo', '==', olduserinfo);
        const q4 = db.collection('subscribing').where('subs_users','array-contains', olduserinfo);

        return Promise.all([q1.get(), q2.get(), q3.get(), q4.get()])
        .then(results => {
            refs = [];
            results.forEach(querySnapshot => {
                querySnapshot.forEach(documentSnapshot => {
                    refs.push(documentSnapshot.ref);
                })
            });
            if (refs.length===0){
                console.log('no changes needed');
                return null;
            } else {
                const newrefs=_.chunk(refs,500)
                newrefs.forEach(nr=>{
                    return db.runTransaction(t => {
                        return t.getAll(...nr)
                            .then(docs => {
                                docs.forEach(doc => {
                                    switch (doc.ref.path.split('/')[0]) {
                                    case 'reco':
                                        const recodata=doc.data().reco_users;
                                        const newrecodata=recodata.map((dt)=>{return dt.uid===olduserinfo.uid ? newuserinfo : dt});
                                        t = t.set(doc.ref, {reco_users:newrecodata})
                                    break;
                                    case 'subscribing':
                                        const subsuser=doc.data().subs_users;
                                        const subsuid=doc.data().subs_users_uid;
                                        const newsubs=subsuser.map((sb)=>{return sb.uid===olduserinfo.uid ? newuserinfo : sb});
                                        t = t.set(doc.ref,{subs_users:newsubs, subs_users_uid:subsuid})
                                    break;
                                    default:
                                        t = t.update(doc.ref, { userinfo: newuserinfo })
                                    }
                                })
                            })
                        })
                })
            }
        })
    })

谢谢!

标签: firebasegoogle-cloud-functions

解决方案


推荐阅读