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

时间:2019-03-28 11:02:05

标签: firebase google-cloud-firestore google-cloud-functions

我不确定我是否对云功能(尤其是Firestore部分)有正确的认识。

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

  1. 该函数似乎不会等到返回的诺言完成。在承诺完成之前进行testProduct refetch。不确定那是否就是firestore功能的工作原理。
  2. 如果我在函数中返回null,那么111的数据仍然会更新。我似乎onWrite并不真正在乎体内运行的是什么?
  3. 我还试图从服务器返回结果(“状态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 个答案:

答案 0 :(得分:0)

您的代码应该可以使用,但是testProducts/2222文档应该已经存在于数据库中。 update()方法的文档说:

  

如果将更新应用于不存在的文档,更新将失败。

您将通过创建,修改或删除testProducts/1111文档来触发Cloud Function,请在此处查看文档:{​​{3}}。

  

onWrite:当onCreateonUpdateonDelete为   触发。


但是,您可以对代码进行一些修改,以使其返回由异步https://firebase.google.com/docs/functions/firestore-events方法返回的promise,而不是返回值。

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. 使用update()方法设置一个侦听器,以侦听对testProducts/2222文档的更改。使用监听器,“ '2222'的最新信息”将自动“下载”,以重新使用您的单词。
  2. 使用从客户端触发并发回响应的onSnapshot()HTTP Cloud Function