开发者问题收集

Cloud Firestore 不会等到返回的承诺完成

2019-03-28
1660

我不确定我是否正确理解了云函数,尤其是 firestore 部分。

如下面的代码片段所示,我正在监听对特定文档的写入,并尝试同时更新其他文档。一旦完成所有操作,客户端将检索所有 testProducts。但是一旦检索完成,'2222' 的最新信息不会被下载,仍然会与旧数据一起显示。我注意到了三个奇怪的结果。

  1. 似乎函数不会等到返回的承诺完成。testProduct 重新获取发生在承诺完成之前。不确定这是否就是 firestore 函数的工作原理。
  2. 如果我在函数中返回 null,111 的数据仍会更新。似乎 onWrite 并不真正关心主体内部运行的内容?
  3. 我还试图从服务器返回结果(“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';
  });
});
1个回答

您的代码应该可以工作,但是 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 when onCreate , onUpdate or onDelete 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' 的最新信息”。

如果您希望在客户端获得响应,您可以:

  1. 使用 onSnapshot() 方法设置侦听器,以便侦听对 testProducts/2222 文档的更改。使用侦听器,“ '2222' 的最新信息” 将自动 “下载”,以便重复使用您的文字。
  2. 使用 HTTP Cloud Function Callable Cloud Function ,从客户端触发并返回响应。
Renaud Tarnec
2019-03-28