2

J'ai fait quelques tests avec firebase et vu la différence dans la validation des règles entre onDisconnect().update() et simple update() en utilisant newData.parent() dans les règles.Pourquoi les règles de validation se comportent-elles différemment (uniquement) avec la mise à jour onDisconnect?

Lorsque j'utilise update() cela fonctionne. Mais avec onDisonnect().update() j'ai PERMISSION_DENIED!

règles de base de données:

{ 
    "rules": { 
     "$id": { 
      ".read": true, 
      ".write": true, 
      "a": { ".validate": true }, 
      "b": { ".validate": "newData.parent().child('a').val() == 'a'" }, 
     } 
    } 
} 

Javascript:

const valid = { 
    a: 'a', 
    b: 'b' 
}; 

function update(obj) { 
    console.log('update', obj); 
    return ref.update(obj); 
} 

function onDisconnectUpdate(obj) { 
    console.log('onDisconnectUpdate', obj); 
    return ref.onDisconnect().update(obj); 
} 

update(valid); 
onDisconnectUpdate(valid); 

Full example code

See a screenshot here

J'espère que vous pouvez me aider.

+0

Bonne question Douglaz. Il a fallu du temps pour déterrer la réponse (malheureuse) que j'ai posté ci-dessous. –

Répondre

0

firebaser ici

Lors d'une opération onDisconnect(), chaque propriété est traitée comme une opération d'écriture séparée alors que nous validons les règles. Cela signifie que dans votre cas, l'opération échoue. Bien que ce soit une conception malheureuse, il est peu probable que cela change dans un proche avenir. Pour cette raison, je recommande d'utiliser des opérations d'écriture plus simples dans les gestionnaires onDisconnect().