为什么我的规则在firebase数据库不工作?

nsc4cvqm  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(162)

我试图添加一个规则,自动合并两个用户,如果用户已经存在相同的电子邮件,只是保持其中一个新用户的最新数据。

match /users/{userId} {
    allow create: if request.resource.data.email != null;
    allow update: if request.resource.data.email != null && request.auth.uid == userId;
    function isDuplicateEmail() {
        return get(/databases/$(database)/documents/users/$(request.resource.data.email)).exists;
    }
    function mergeUsers(userId) {
        // Get the data of the new user
        let newUser = get(/databases/$(database)/documents/users/$(userId)).data;
        
        // Get the data of the existing user
        let existingUser = get(/databases/$(database)/documents/users/$(newUser.email)).data;
        
        // Merge the data from the two users
        let mergedData = {...existingUser, ...newUser};
        
        // Update the data of the existing user
        return update(/databases/$(database)/documents/users/$(newUser.email), mergedData);
    }
    allow create: if !isDuplicateEmail()
    allow create: if isDuplicateEmail() && mergeUsers(userId);
}

但我在规则编辑器中看到一个错误:“意外的“}"。第40行:

let mergedData = {...existingUser, ...newUser};

我错过了什么?谢谢。

huwehgph

huwehgph1#

安全规则表达式语言不像JavaScript那样支持... spread运算符。事实上,它根本不是JavaScript--它只是看起来有点像JS。您可能想在documentation中阅读有关它的语法。
除此之外,没有名为update的函数。你根本不能修改安全规则中的数据。你只能检查是否允许或拒绝传入的访问。如果你想修改文档数据,你必须为此编写应用程序或后端代码。

cclgggtu

cclgggtu2#

}正在使用mergeUsers()函数的allow create语句之前关闭match语句。请尝试:

match /users/{userId} {
        allow create: if request.resource.data.email != null;
        allow update: if request.resource.data.email != null && request.auth.uid == userId;
        function isDuplicateEmail() {
            return get(/databases/$(database)/documents/users/$(request.resource.data.email)).exists;
        }
        function mergeUsers(userId) {
            // Get the data of the new user
            let newUser = get(/databases/$(database)/documents/users/$(userId)).data;
            
            // Get the data of the existing user
            let existingUser = get(/databases/$(database)/documents/users/$(newUser.email)).data;
            
            // Merge the data from the two users
            let mergedData = {...existingUser, ...newUser};
            
            // Update the data of the existing user
            return update(/databases/$(database)/documents/users/$(newUser.email), mergedData);
        }
        allow create: if !isDuplicateEmail()
        allow create: if isDuplicateEmail() && mergeUsers(userId);
    }

此外,如果您打算使用update函数,还需要包含一个允许更新发生的规则。

相关问题