Cloud Firestore 不会等到返回的承诺完成
我不确定我是否正确理解了云函数,尤其是 firestore 部分。
如下面的代码片段所示,我正在监听对特定文档的写入,并尝试同时更新其他文档。一旦完成所有操作,客户端将检索所有 testProducts。但是一旦检索完成,'2222' 的最新信息不会被下载,仍然会与旧数据一起显示。我注意到了三个奇怪的结果。
- 似乎函数不会等到返回的承诺完成。testProduct 重新获取发生在承诺完成之前。不确定这是否就是 firestore 函数的工作原理。
- 如果我在函数中返回 null,111 的数据仍会更新。似乎 onWrite 并不真正关心主体内部运行的内容?
- 我还试图从服务器返回结果(“status 200”),但显然客户端什么也没有得到。
感谢任何帮助。
exports.updateProduct = functions.firestore.document('testProducts/1111').onWrite((change, context) => {
const newValue = change.after.data();
return admin.firestore().doc('testProducts/2222').update({
description: newValue.name
}).then((value) =>{
console.log('Hello World');
return 'status 200';
});
});
您的代码应该可以工作,但是
testProducts/2222
文档必须已经存在于数据库中。
update()
方法的文档说明:
The update will fail if applied to a document that does not exist.
您可以通过创建、修改或删除
testProducts/1111
文档来触发 Cloud Function,请参阅此处的文档:
https://firebase.google.com/docs/functions/firestore-events
。
onWrite
: Triggered whenonCreate
,onUpdate
oronDelete
is triggered.
但是,您可以稍微修改一下代码,以便返回异步
update()
方法,而不是值。
exports.updateProduct = functions.firestore.document('testProducts/1111').onWrite((change, context) => {
const newValue = change.after.data();
return admin.firestore().doc('testProducts/2222').update({
description: newValue.name
})
});
请注意,使用
onWrite()
触发器在后台触发的 Cloud Function 时,客户端不应该收到任何响应:该过程在后台进行。因此,
'status 200'
永远不会返回到客户端,如果您不向数据库发出新查询,“则不会下载
'2222'
的最新信息”。
如果您希望在客户端获得响应,您可以:
-
使用
onSnapshot()
方法设置侦听器,以便侦听对testProducts/2222
文档的更改。使用侦听器,“'2222'
的最新信息” 将自动 “下载”,以便重复使用您的文字。 - 使用 HTTP Cloud Function 或 Callable Cloud Function ,从客户端触发并返回响应。