2017-01-09 66 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