我在特定时间触发 Firebase 的云功能。该功能已正确触发。
当函数仍然需要执行时,在我的场景中,函数将写入的数据可能会在 main while 中被删除。
因此,删除数据后,会创建一条包含
.update()
数据的新路径。
我怎样才能避免这种行为?是否有一些函数可以调用来停止某个功能?
这是我的代码示例。 现在的情况是关于两个函数:
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}); }); } 别的 { 返回; } });
我提到的第二个功能是用户删除,如下所示:
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) 原子数据库写入 OR
b) 检查更新标志并且不执行更新。
看看这个链接https://youtu.be/7E13ZBCyKT0?t=5m
视频 5 分钟后Jen Person 解释了如何确保更新不会触发数据库并陷入无限循环。
如果您分享一些代码,我们也许能够提供进一步的帮助。