Firebase 云firestore不会等到返回的承诺完成

Firebase 云firestore不会等到返回的承诺完成,firebase,google-cloud-firestore,google-cloud-functions,Firebase,Google Cloud Firestore,Google Cloud Functions,我不确定我对云功能是否有正确的想法,尤其是firestore部分 正如下面的代码片段所示,我正在侦听对特定文档的写入,同时尝试更新其他文档。完成所有测试后,客户端将检索所有testProducts。但一旦检索完成,“2222”的最新信息不会被下载,并且仍然与旧数据一起显示。我注意到了三个奇怪的结果 函数似乎不会等到返回的承诺完成。testProduct重新蚀刻发生在承诺完成之前。不确定firestore功能是否就是这样工作的 如果我在函数中返回null,111的数据仍然会被更新。我看起来onWr

我不确定我对云功能是否有正确的想法,尤其是firestore部分

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

  • 函数似乎不会等到返回的承诺完成。testProduct重新蚀刻发生在承诺完成之前。不确定firestore功能是否就是这样工作的
  • 如果我在函数中返回null,111的数据仍然会被更新。我看起来onWrite并不真正关心主体内部运行的是什么
  • 我还试图从服务器返回一个结果(“状态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
    文档。该方法的文档说明:

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

    您可以通过创建、修改或删除
    testProducts/1111
    文档来触发云功能,请参见此处的文档:

    onWrite
    :当
    onCreate
    onUpdate
    onDelete
    被激活时触发 触发


    但是,您可以稍微修改代码,以返回异步方法返回的承诺,而不是值

    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()
    触发器触发云函数时,客户端不应接收任何响应:该过程发生在后台。因此,
    'status 200'
    永远不会返回给客户端,如果您不向数据库发出新的查询,“不会下载
    '2222'
    的最新信息”

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

  • 使用该方法设置侦听器,以便侦听对
    testProducts/2222
    文档的更改。有了监听器,
    '2222'
    的最新信息将被自动下载,以重复使用您的文字
  • 使用从客户端触发并返回响应的或

  • 我认为您误解了云函数后台触发器(包括Firestore触发器)的工作原理。它们不会将数据“返回”到客户端。它们只是对符合触发器定义的更改做出响应。如果您需要将数据返回到客户端,请改用HTTP触发器。这是否意味着对doc 1111的更新请求实际上已经完成并返回到客户端,并且此firestore函数只是捕获更改并提供执行其他操作的机会?函数仅在进行更改后才会触发。他们不会截取任何东西来改变结果。你救了我一天,谢谢@Dougstevenson谢谢你的澄清。是的,testProducts/2222确实存在于firestore中。我想我的关键问题更像是当客户端试图更新doc1111时,客户端是否等待上述firestore函数完成?或者它只是不关心并立即完成,然后这个函数被触发去做一些额外的事情?实际上,默认情况下,客户端不知道后台触发的云函数在做什么。当doc 1111中写入内容时,后台触发的云函数被触发。它可以从Firebase控制台、另一个云功能或客户端写入,这没有任何区别。@Panda World您好,您有时间查看建议的解决方案吗?