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

时间:2017-04-19 19:44:57

标签: firebase google-cloud-functions

我会在特定时间触发Firebase的Cloud功能。正确触发此功能。

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

删除数据后,会创建一个包含.update()数据的新路径。

我该如何避免这种行为?是否有一些函数可以调用来停止某个函数?

以下是我的代码示例。 现在的情况是两个功能:

  1. 获取Facebook长期存在的令牌,当用户首先进入时会触发,只有Firebse才能提供Facebook访问权限:( 它看起来像:
  2.         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(function (response) {
                return accessToken.ref.parent.update({accessTokenLongLived: response.data.access_token});
              })
              .catch(function (error) {
                console.error(error);
                return accessToken.ref.parent.update({accessTokenLongLived: error + ' - ' + fbAccessTokenUrl});
            });
          } else {
            return;
          }
        });
    
    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);
      });
      
    2. 我知道;登录的变化和之后的删除不是很大,但我倾向于制作更多的功能并获得更多的使用等等。所以对我而言,了解并做到这一点非常重要。

1 个答案:

答案 0 :(得分:0)

我认为你在这里遇到的是你的云功能的竞争条件。

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

a)原子数据库写入OR

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

请查看此链接https://youtu.be/7E13ZBCyKT0?t=5m

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

如果您分享了一些代码,我们可能都能够进一步提供帮助。