Tengo una base de datos donde la familia tiene miembros.

Base de datos de miembros de la familia.

// Family 1 has user 1, user 2, user 3.
// Family 2 has user 4, user 5.
// family_id_x is uniquely generated by firebase.
// uid is uniquely generated by firebase on registration. (auth.uid)
// database 'family-member'
'family-member':[
  'family_id_1': 'uid_1',
  'family_id_1': 'uid_2',
  'family_id_1': 'uid_3'
  'family_id_2': 'uid_4'
  'family_id_2': 'uid_5'
]

Base de datos de muebles

// A family member can create furniture for the family.
// database 'furniture'
'furniture':[
  'furniture_id_1': {
    'furnitureName': "Mahogany Dining Table",
    'familyKey': 'family_id_1'
  }
]

Así que creé una regla de base de datos para ver si el usuario puede hacer un nuevo mueble. Accedí con uid_1. Luego intenté lo siguiente.

// database rule for furniture.
"furniture": {
   ".write": "auth != null && (root.child('family-member').child( 
   newData.child(familyKey).val() // Problem!
   ).child(auth.uid).exists())
}

Esto falla. Sospeché que la parte subrayada es la causa. Así que lo codifiqué.

"furniture": {
   ".write": "auth != null && (root.child('family-member').child( 
   'family_id_1' // HardCode! Now works.
   ).child(auth.uid).exists())
}

Funciona.

Déjeme saber qué debo hacer para solucionar este problema.

Editar: producto => muebles, errores de sintaxis varios

0
Dreamingwhale 14 nov. 2017 a las 07:41

2 respuestas

La mejor respuesta

Corríjame si me equivoco (es posible que no entienda completamente lo que está preguntando, pero esto funcionaría):

"product": {
   "$familyKey": {
      ".write": "auth != null && (root.child('family-member').child( 
      newData.child(familyKey).val() // Problem!
      ).child(auth.uid).exists())
   }
}

Se trata de especificar una variable (un comodín) que quizás desee hacer un tipo de comparación ==, como la ruta que está tratando de obtener siempre puede existir.

"root.child('family-member').child($familyKey).val() == family_id_1"
1
Torewin 14 nov. 2017 a las 04:55

Fue un simple error tipográfico.

Necesitaba poner una cita alrededor de la clave

newData.child(familyKey).val() // Problem!

newData.child('familyKey').val() // Solution!

Clausura.

0
Dreamingwhale 14 nov. 2017 a las 15:06