我已经在论坛上搜索了有关此问题的答案,但找不到答案。 我正在将一个“键:值”对写入Firebase数据库,并希望设置规则。
这是一个聊天应用程序,我为用户所属的每次聊天添加一个字段,例如user / $ uid / chat / $ chat_id
我正在使用创建的chatId
FirebaseDatabase.getInstance().getReference().child("chat").push().getKey();
我正在尝试添加某种验证,以便数据必须包含$ chat_id:true。 但是我正在努力使通配符起作用。
我正在编写的测试数据- “ -M5STgMVWyafV-LhPIT2”:“ true”,但是我需要将Key用作通配符,因为它每次都是随机的。
数据结构如下。
chat
-M5STgMVWyafV-LhPIT2 // <<< $chat_id
info
admin: "zQvmGG2vPfTrdjZBfWP2ZotajYE2"
groupName: "Some Group"
id: "-MJD6cAtpxY_jmFyk-sb"
no_of_users: 2
timer: 60000
users
y1EKihfmIJTDCD9OJt0N89WDC642: true
zQvmGG2vPfTrdjZBfWP2ZotajYE2: true
messages
-MJ0G0gdecak8ACR7fb2
creator: "wjl8VNmcaPNHJAUQnCDRHWkJ33p2"
date: "Oct 06, 2020"
text: "Some Text"
time: "23:13"
userName: "Bob"
user
zQvmGG2vPfTrdjZBfWP2ZotajYE2
chat
-M5STgMVWyafV-LhPIT2: true // <<< $chat_id
-MGNk6fl8jneDhw7Jv02: true
-MGNkFGD4OYb7ZSzX8P2: true
-MGNl47kbPuNZFc3RLD2: true
-MGNyFIuhjrwyQT4VME2: true
-MGNydtnFHW60i5TbzW2: true
-MJ-ETJ-LcOxvYkZ8b72: true
info
email: "someemailaddress@me.com"
name: "Bob"
notificationKey: "be5df5fa-3a20-4704-986f-8a35d"
profilePic: "https://"
status: "Some status"
zQvmGG2vPfTrdjZBfWP2ZotajYE3
zQvmGG2vPfTrdjZBfWP2ZotajYE4
还有我尝试过的规则,如果我将$ chat_id指定为字符串,这些规则将起作用。
{
"rules": {
"user": {
".read": "auth != null",
".indexOn": "info/email",
"$user_id": {
"chat": {
".write": "auth != null",
".validate": "newData.child($chat_id).val() == 'true'", // <<< this doesn't work Unknown variable '$chat_id'.
//".validate": "newData.child("-M5STgMVWyafV-LhPIT2").val() == 'true'", <<< this works, but not $chat_id, I need this Child to be a wildcard
},
"info": {
//".indexOn": "email",
".write": "auth != null && $user_id === auth.uid",
},
}
},
"chat": {
//".write": "auth != null && !data.child('chat').child('$chat_id').exists()",
"$chat_id": {
"info": {
".read": "data.child('users').child(auth.uid).exists()",
".write": "auth != null && !data.exists()&&newData.child('admin').val()==auth.uid || data.child('users').child(auth.uid).exists()",
},
"messages": {
"$message_id": {
".write": "root.child('chat').child($chat_id).child('info').child('users').child(auth.uid).exists()",
".read": "root.child('chat').child($chat_id).child('info').child('users').child(auth.uid).exists()",
}
}
}
},
}
}
任何帮助将不胜感激。 谢谢
答案 0 :(得分:0)
此:
$chat_id
表示您正在检查新数据是否有一个子节点,其字面称为$
。除了不正确的事实(因为密钥中不允许使用$chat_id
)之外,它也可能不是您想要的。
如果您想检查新数据中的子数据是否与数据库中的$chat_id
相同,请使用不带引号的newData.hasChild($chat_id)
。所以:
tsc -h
答案 1 :(得分:0)
我找到了正确的语法。我需要在write函数之后添加变量,然后将validate放在变量之后。
以防万一以后帮助任何人。
"$user_id": {
"chat": {
".write": "auth != null",
"$chat_id": {
".validate": "$chat_id.length === 20 && newData.val() === 'member'",
},
},