通过使用Cloud Functions,在编辑“用户”集合中的文档时,无论用户ID存放在哪里,都应在uploads
集合中更新已编辑的文件。
对于上述要求,我正在使用以下功能。
const functions = require('firebase-functions');
const admin = require('firebase-admin');
const settings = {
timestampsInSnapshots: true
};
admin.initializeApp();
admin.firestore().settings(settings);
var db = admin.firestore();
exports.updateUser = functions.firestore.document('users/{userId}')
.onUpdate((change, context) => {
var userId = context.params.userId;
const newValue = change.after.data();
const name = newValue.display_name;
var uploadsRef = db.collection('uploads');
uploadsRef.where('user.id', '==', userId).get().then((snapshot) => {
snapshot.docs.forEach(doc => {
doc.set({"display_name" : name}); //Set the new data
});
}).then((err)=> {
console.log(err)
});
});
执行此操作时,我在日志中收到以下错误。
TypeError: doc.set is not a function
at snapshot.docs.forEach.doc (/user_code/index.js:31:21)
at Array.forEach (native)
at uploadsRef.where.get.then (/user_code/index.js:29:27)
at process._tickDomainCallback (internal/process/next_tick.js:135:7)
还有下面的内容。
Unhandled rejection
我该如何解决这个问题?处理快照文档更新的最佳方法是什么?
答案 0 :(得分:1)
在get()对象上执行Query时,它将产生一个 QuerySnapshot个对象。使用其docs属性时,将迭代QuerySnapshotDocument对象的数组,其中包含匹配文档中的所有数据。似乎您假设QuerySnapshotDocument对象具有set()方法,但是您可以从链接的API文档中看到它没有。
如果要写回QuerySnapshotDocument中标识的文档,请使用其ref属性获取确实有DocumentReference的set()对象方法。
doc.ref.set({"display_name" : name}); //Set the new data
请记住,如果进行此更改,它将运行,但可能不会更新所有文档,因为您还忽略了set()方法返回的承诺。您需要将所有这些promise收集到一个数组中,并使用Promise.all()生成一个新的promise,以从函数中返回。这对于帮助Cloud Functions了解所有异步工作何时完成是必要的。