防止Firebase函数覆盖现有数据

时间:2020-07-02 05:37:29

标签: firebase firebase-realtime-database

出于以下几个原因,我正在将在应用程序中创建用户的过程转移到firebase函数,但遇到了一个问题:

我有一个/ users ref和/ usernames,在创建用户时,我将其信息保留在用户名和用户名中(可以公开访问以查看用户名是否可用)作为事务,以便在添加用户名时立即添加创建了一个用户,并且我的安全规则阻止了覆盖现有数据。

但是,使用Firebase函数会绕过这些安全规则,因此可能会有2个用户使用相同的用户名注册,而一个人的数据将被另一个人覆盖的情况

是否有一种方法可以防止从云功能覆盖现有数据? (理想情况下,不让他们通过安全规则)

1 个答案:

答案 0 :(得分:1)

我遇到了类似的问题,发现最好的解决方案是使用firebase提供的交易方法。

假设您有用户名ref,则可以执行以下操作:

db.ref('usernames').child(theUsername).transaction(function (usernameInfo) {
    if (usernameInfo === null) {
        return {
            ...anObjectOfUserData // or could just return true
        }
    }

    // if the data is not null it means the username is used 
    // returning nothing makes the transaction do no updates
    return 
}, function (error, isComitted, snap) {
   //
   // Use isCommitted from the onComplete function to determine if data was commited 
   // DO NOT USE the onUpdate function to do this as it will almost certainly run a couple of times
   //
})