如何取消正在进行的云功能?

问题描述 投票:0回答:1

我在特定时间触发 Firebase 的云功能。该功能已正确触发。

当函数仍然需要执行时,在我的场景中,函数将写入的数据可能会在 main while 中被删除。

因此,删除数据后,会创建一条包含

.update()
数据的新路径。

我怎样才能避免这种行为?是否有一些函数可以调用来停止某个功能?

这是我的代码示例。 现在的情况是关于两个函数:

  1. 获取 Facebook 长期令牌,该令牌在用户首次登录时触发,然后 Firebase 才提供 Facebook 访问令牌:( 看起来像:
 Exports.getFacebookLongLivedAccessToken =functions.database.ref('/users/{uid}/...').onWrite(event => {
      const accessToken = event.data;
       
      if(event.data.val() !== null) {
        const baseFBUrl = "https://graph.facebook.com/oauth/access_token?client_id=...&client_secret=...&grant_type=fb_exchange_token&fb_exchange_token="
        const fbAccessTokenUrl = baseFBUrl + accessToken.val();
    
        axios.get(fbAccessTokenUrl)
          .then(函数(响应){
            返回 accessToken.ref.parent.update({accessTokenLongLived: response.data.access_token});
          })
          .catch(函数(错误){
            控制台.错误(错误);
            return accessToken.ref.parent.update({accessTokenLongLived: error + ' - ' + fbAccessTokenUrl});
        });
      } 别的 {
        返回;
      }
    });
  1. 我提到的第二个功能是用户删除,如下所示:

     exports.cleanupUserData = functions.auth.user().onDelete(event => {
         const uid = event.data.uid;
         console.error(uid)
         console.error(event.data)
         return admin.database().ref('/users/' + uid).remove();
         //return uid.ref.parent.remove(uid);
     });
    

我知道;登录后删除的变化并不大,但我倾向于做更多的功能和更多的使用等等。所以对我来说,理解并正确理解这一点很重要。

firebase google-cloud-functions
1个回答
2
投票

我认为您可能在这里遇到的是云函数的竞争条件。

基本上在一个地方或另一个地方你需要做其中一个

a) 原子数据库写入 OR

b) 检查更新标志并且不执行更新。

看看这个链接https://youtu.be/7E13ZBCyKT0?t=5m

视频 5 分钟后Jen Person 解释了如何确保更新不会触发数据库并陷入无限循环。

如果您分享一些代码,我们也许能够提供进一步的帮助。

© www.soinside.com 2019 - 2024. All rights reserved.