我在特定时间触发 Firebase 的云函数。该函数已正确触发。
当函数仍然需要执行时,在我的场景中,函数将写入的数据可能会被删除 main while。
因此,删除数据后,会创建一个包含 .update()
数据的新路径。
我怎样才能避免这种行为?是否有一些函数可以调用来停止某个函数?
这是我的代码示例。 现在的情况是关于两个函数:
- 获取 Facebook 长期 token ,该 token 在用户首次登录时触发,然后 Firebse 才会提供 Facebook 访问 token :( 它看起来像:
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; } });
The second function I mentioned about, is a user deletion, this looks like:
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); });
我知道;登录后删除的变化并不大,但我倾向于做更多的功能和更多的使用等等。因此对我来说,理解并正确对待这一点很重要。
最佳答案
我认为您在这里可能遇到的是云函数的竞争条件。
基本上,在一个地方或另一个地方,您需要执行以下任一操作
a) 原子数据库写入或
b) 检查更新标志并且不执行更新。
看看这个链接 https://youtu.be/7E13ZBCyKT0?t=5m
视频播放 5 分钟 Jen Person解释如何确保更新不会触发数据库并陷入无限循环。
如果您分享一些代码,我们也许能够提供进一步的帮助。
关于firebase - 如何取消正在进行的云功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43504777/