我正在尝试建立一个聊天室,您可以在其中看到所有消息,但被排除在外的消息除外。 您(很难)无法使用firebase查询“ isNotEqualTo”,这就是我不得不作弊的原因,这是一个更清晰的示例:
假设我们有3个用户:user1,user2和user3。 user1为除user2之外的所有用户发布了一条消息,该消息为:
messages
|__ 0
|__ "author": "user1"
|__ "message": "hello world"
|__ "user1": true
|__ "user3": true
现在我可以查询:
firebase.database().ref("messages").orderByChild(myAuthUid).equalTo(true)...
→user1和user3将看到消息。
→user2不会。
现在,我尝试构建仅强制执行此查询的适当规则,该规则应类似于query.orderByChild == auth.uid && equalTo == true
这里的问题是query.orderByChild == auth.uid
,它指示此错误:
“无效==表达式:右操作数必须是有序或字符串 与订单进行比较时的原义。”
已将票证提交给了Firebase支持,但idk需要花费多少时间,因此可以解决此问题,这就是我正在寻找替代方案的原因。
与此问题相关的另一个主题:Query-based rules with auth.uid not working
我非常喜欢火力基地,但是对我来说,一些容易想到的事情对我来说已经变得很重要了吗?
答案 0 :(得分:1)
这听起来像是个错误,尤其是在规则系统似乎在进行其他一些健全性检查(错误消息不会中继)的情况下。例如,即使从技术上来说,这是一个(无效的)字符串文字,也无法使用query.orderByChild == 'auth.uid'
。
作为一种解决方法,您可能只使用query.equalTo == auth.uid
作为安全规则,但这意味着调整数据库结构以遵循以下格式:
messages
|__ 0
|__ "author": "user1"
|__ "message": "hello world"
|__ "user1": "user1"
|__ "user3": "user3"
因此,您不必使用true
作为每个用户的值,而是使用用户的ID(以匹配键名)。因此,您的查询将需要类似于:
firebase.database().ref("messages").orderByChild(myAuthUid).equalTo(myAuthUid)
您的安全规则为:
{
"rules": {
".read": "auth.uid != null && query.equalTo == auth.uid"
}
}
当您在Firebase支持下提出问题时,他们也许可以提供更多的见解或发布修复程序,但这暂时应该起作用。