2017-01-09 153 views
-1

当user1 - > user2(user1向user2发送请求)。我想执行使用火力规则某些检查,它们是:

  1. 检查是否存在USERNAME2
  2. 检查如果两个用户尚未朋友

的,我已经写了下面的规则:

{ 
    "rules": 
    { 
    "requests": 
    { 
     "$requestId": 
     { 
     ".read": "auth != null", 
     ".write": "auth!=null && 
        data.child('username2').val() == true && 
        root.child('usernames-list').child(data.child('username2')).exists() && 
        !root.child('user-requests').child(auth.uId).child('accepted-pending').child($requestId2).child(data.child('username2')).exists()" 
     } 
    } 
    } 
} 

但它在两个方面会返回以下错误:

  1. data.child('username2')---->第9行:child()需要一个字符串参数。
  2. data.child($ requestId2)---->第9行:未知变量$ requestId2

数据结构:

requests 
---$requestId 
    ---key: value 

user-requests 
---$userId 
    ---pending 
     ---$requestId    
      ---key: value 
    ---accepted 
     ---$requestId 
      ---key: value 
    ---rejected 
     ---$requestId 
      ---key: value 
    ---unfriend 
     ---$requestId 
      ---key: value 
    ---accepted-pending 
     ---$requestId    
      ---key: value 

传入的JSON:

user1  --> authId of user1 
username1 --> username of 1st user 
username2 --> username of 2nd user 
... 

注1 :我试过使用newData.而不是data.,但仍然出现相同的错误。注意2:我可以通过创建一个单独的列表来避免$requestId2(错误),该列表只包含用户user1是朋友的用户名,并将其与它进行比较;而且,newData('username2').isString()也会返回相同的错误

但我仍然需要能够使用data.('username2')作为字段root.child()

编辑1:以下规则发布成功,但我不确定它是否仍然按照我所提到的(需要检查):

".write": "auth!=null && 
      newData.child('username2').val() == true && 
      root.child('usernames-list').hasChild(newData.child('username2').val()) && 
      !root.child('user-requests').child(auth.uId).child('accepted-pending-usernames').hasChild(data.child('username2').val())" 

价:Firebase security - newData() as a parameter of hasChildren() expression

+0

's/auth.uId/auth.uid/g'(换句话说:用'auth.uid'替换'auth.uId')来摆脱第一个错误信息。 JavaScript是区分大小写的和'auth.uId' <>'auth.uid'。 –

+2

用'$ requestId'替换'$ requestId2'来摆脱第二个错误信息。 –

+0

@FrankvanPuffelen但是'$ requestId'和'$ requestId2'并不总是相同的。因此,它更像'$ wildcard1'和'$ wildcard2' – Zen

回答

1

编辑2:这应该是溶液:

  1. .val()已t的范围内加入他括号
  2. .exists()保持在
  3. 我创建的用户名的单独列表(/accepted-pending-usernames/)最终克服了通配符错误
  4. data已被替换newData

    ".write": "auth!=null && 
          newData.child('username2').val() == true && 
          root.child('usernames-list').child(newData.child('username2').val()).exists() && 
          !root.child('user-requests').child(auth.uId).child('accepted-pending').child('accepted-pending-usernames').child(data.child('username2').val()).exists()" 
    

注意:问题可能仍然没有解决,因为它的不清楚,如果firebase允许在r中使用多个通配符ules