【问题标题】:How to terminate Cloud Function Firestore Trigger after Query then write如何在查询后终止 Cloud Function Firestore 触发器然后写入
【发布时间】:2021-09-11 23:43:22
【问题描述】:

我对 Cloud Functions、Typescript 和 Async/await 语法有点陌生。我想做的是在我的云函数上,我想观察 Firestore 的 onCreate,然后我将执行查询并使用 onSnapshot 观察(不获取),并在查询后执行写操作。所有这些都已经完成了,但是有一些问题。写操作发生前大约需要 1-2 分钟。我很确定这是由于 async/await 问题。我看过几个教程,但我找不到可以解决问题的具体教程。在下面的代码中,给出了三个集合(collectionA、collectionB、collectionC),并且collectionB 有一个文档“TestDocumentID”。另外,我不确定在哪里以及如何调用“取消订阅”功能。非常感谢您。

export const onCreateItem = functions.firestore
.document('collectionA/{uid}')
.onCreate((snap, context) => {
  return firestore.collection('collectionB').doc('TestDocumentID')
    .onSnapshot(result => {

    const test =  { 'test': 'asd' };

    return firestore.collection('collectionC').doc().set(test);
  });
});`

【问题讨论】:

    标签: typescript google-cloud-firestore async-await google-cloud-functions


    【解决方案1】:

    请勿在 Cloud Functions 中使用 onSnapshot()。添加这样的持久监听器肯定不是您想要做的。此外,onSnapshot() 不返回承诺,因此您从函数提供的返回值对 Cloud Functions 没有意义。

    相反,您应该使用 get() 来查询 Firestore。它返回一个承诺,您可以使用它继续您的工作,并在所有工作完成时告诉 Cloud Functions。

    【讨论】:

    • 好的,谢谢。我看过你的教程。谢谢。我没有看到任何警告我不要在云函数中使用 onSnapShot() 的文档,有吗?另外,如果我在您的教程中忽略了它,请告诉我。我接受了答案,看来我只需要在客户端调用 onSnapshot 即可。在我的用例中,我需要使用 onSnapshot,而不是 get。
    • 我可以在云功能中使用 runTransaction 吗?如果是这样,return 语句会是什么样子?
    • @user7888262 是的,你可以,但如果你只是为了增加一个值,最好使用admin.firestore.FieldValue.increment(NUMBER_TO_INCREMENT)
    【解决方案2】:

    可能延迟与cold start 有关。退订是什么意思?通常当任务完成时,无论是由于错误/超时而失败还是成功,该功能也会立即终止,因此您不需要像移动或 Web SDK 那样删除快照侦听器。

    另外,我不记得 Firestore 的云功能中存在任何 .onSnapshot(),如果有,根据您给定的样本,这可能不是最好的做法。请务必先查看官方documentation,它写得很好,并且有很多代码 sn-p 可供使用。

    【讨论】:

    • 关于冷启动。我对冷启动不太熟悉,但根据我的基本搜索,一个例子是,“第一次冷启动发生在部署后第一个请求进入时。” .我不认为这是我的情况,因为我已经尝试了好几个小时了。关于退订。我认为 onSnapshot 返回一个承诺(就像 get 一样),但根据@Doug Stevenson 的回答,我没有也不应该在云功能上使用 onSnapshot。关于 onSnapshot 的使用。它存在于云功能中。也许我只需要在客户端使用它。
    • 是的,他说的是对的,这可能不是您真正想做的事情,因为从技术上讲,您不需要在调用 onCreate、onWrite 等之后实时收听功能。如果您想执行查询,所有实时侦听应该已经并且仅在该点并且在您使用 get() 的函数内部。
    • 请记住不要像在您的示例中那样创建嵌套的实时侦听器。即使在客户端,所有监听器也应该分开而不是嵌套。
    猜你喜欢
    • 2019-01-05
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2020-01-02
    • 2020-05-28
    • 1970-01-01
    • 2019-09-06
    相关资源
    最近更新 更多