query.orderByChild==auth.uid的Firebase规则替代项

query.orderByChild==auth.uid的Firebase规则替代项,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我试图建立一个聊天室,你可以看到所有的消息,除了你被排除在外的消息。 你(很遗憾)不能用firebase查询“isNotEqualTo”,这就是我不得不作弊的原因,这里有一个更清楚的例子: 假设我们有3个用户:user1、user2和user3。user1为除user2之外的所有用户发布了一条消息,这将是: messages |__ 0 |__ "author": "user1" |__ "message": "hello world" |__ "

我试图建立一个聊天室,你可以看到所有的消息,除了你被排除在外的消息。 你(很遗憾)不能用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将看到消息

→ 用户2将不会

现在,我尝试构建只强制执行此查询的适当规则,它应该看起来像
query.orderByChild==auth.uid&&equalTo==true

这里的问题是
query.orderByChild==auth.uid
,它引用了以下错误:

无效==表达式:右操作数必须是顺序或字符串 与排序进行比较时的文字。”

已经向firebase支持部门提交了一张罚单,但idk知道解决此问题需要多长时间,这就是我寻找替代方案的原因

与此问题相关的另一个主题:


我非常喜欢firebase,但我认为简单的东西对我来说是件大事,有什么想法吗?

这听起来像个bug,特别是规则系统似乎正在做一些额外的健全性检查,以确保错误消息不会传递。例如,使用
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支持下提出此问题时,他们可能能够提供更多的见解或发布修复程序,但这应该暂时起作用。

这似乎是一个错误,因为即使您这样做,您也会收到相同的错误:
query.orderByChild==“auth.uid”
,它应该使用
“auth.uid”的精确字符串表示形式
作为字符串文本(不是变量)。可能值得ping一条消息,看看他是否能解释这一点。@Grimthorr query.orderByChild=='auth.uid'我认为是另一个问题。我已经试过了,我认为点“.”代表了一些东西,这就是为什么你不能像那样使用它。例如,尝试将“auth.uid”替换为“hello.world”,您也会得到一个错误……正如我所说,已经提交了一个票证,因此不确定是否有解决方案。摘自我与Firebase支持部门@Ritz的讨论:“但由于某些原因,auth.uid未被视为字符串。”“目前,我建议避免在规则中使用query.orderByChild==auth.uid,以便继续工作。”这是正确的,可能是因为
不是节点名称的有效字符,但从技术上讲,它仍然是这种形式的字符串文字,因此错误并不完全匹配。如果您调整了结构,将用户ID同时用作键和值(例如:
“user1”:“user1”
),那么您可能只使用
query.equalTo==auth.uid
),而不使用它。这是什么意思?这可能是一个很好的临时解决方案,我不知道为什么我之前没有想到这一点(有趣的是,我第一次使用userid作为这样的值)谢谢!