咨询Firebase Realtime DB Rules中解析写入值及字符截取的可行性
Firebase Realtime数据库规则:解析写入值的正确写法
你提到的两种需求都可以通过Firebase安全规则的字符串操作实现,但你当前的写法存在语法错误,以下是修正后的可行方案:
1. 移除:及之后的内容
要从写入值(如2022090800:29)中去掉冒号及后面的部分,可通过两种方式实现:
方案1:用split()分割字符串
"write": "(root.child('Game/' + newData.val().split(':')[0] + '/isPlayed').val() == false)"
split(':')会将字符串按冒号分割为数组,[0]取数组第一个元素,即冒号前的目标内容。
方案2:用replace()正则匹配替换
"write": "(root.child('Game/' + newData.val().replace(/:.*/, '') + '/isPlayed').val() == false)"
正则/:.*会匹配冒号及后续所有字符,替换为空字符串后即可得到冒号前的内容。
2. 仅取值的前10个字符校验
要提取字符串的前10个字符,需使用substring()方法(Firebase规则中length是获取字符串长度的属性,不能直接用于截取):
"write": "(root.child('Game/' + newData.val().substring(0, 10) + '/isPlayed').val() == false)"
substring(0,10)会截取从索引0到9的字符(共10个),正好对应你需要的前10位内容。
额外提示
- 若写入值可能是数字类型,需先转为字符串:
newData.val().toString() - 若存在写入值为空或长度不足10的情况,建议添加判断避免报错,例如:
"write": "(newData.val().length >= 10 && root.child('Game/' + newData.val().substring(0, 10) + '/isPlayed').val() == false)"
内容的提问来源于stack exchange,提问作者Learn2Code
相关产品推荐
相关产品推荐

