firebase - Firebase 云功能:使用事务更新函数中的代码后出现“无法获取默认凭据”错误
问题描述
这是我写的云函数的作用:
- 收听“用户”集合中的更新。
- 获取多个集合中的所有相关文档。
- 使用事务相应地更新文档。
为了获得每个事务大约 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 })
}
})
})
})
})
}
})
})
谢谢!
解决方案
推荐阅读
- python - Amazon Keyspaces sync_table() 不会立即看到表
- android - Android Navigation - 在返回堆栈操作上传递参数
- javascript - Google 登录按钮自定义
- linux - 加载 linux 操作系统时收到错误消息
- python - Python - Matplotlib 条形图在 X 中的值多于数据集中的值
- python - 如何拆分包含特殊字符的字符串
- android - 华为SDK hwid项目单元测试失败
- firebase - 颤动未读消息徽章断言失败:布尔表达式不能为空
- javascript - 如何在数字之间添加分隔符?
- maven - 在 Maven 子模块中使用进化属性