Firebase, pembaruan multi lokasi

Pertimbangkan kode berikut untuk penulisan atomik di beberapa lokasi di FireBase:

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");

var newPostRef = ref.child("posts").push();
var newPostKey = newPostRef.key();

var updatedUserData = {};
updatedUserData["users/"+authData.uid+"/posts/" + newPostKey] = true;
updatedUserData["posts/" + newPostKey] = {
  title: "New Post",
  content: "Here is my new post!"
};

ref.update(updatedUserData, function(error) {
  if (error) {
    console.log("Error updating data:", error);
  }
});

Pendekatan ini dapat digunakan untuk memperbarui postingan di lokasi berbeda, tetapi bagaimana cara menerapkan pembaruan atom di sisi server? (melalui aturan).

Bagaimana cara memastikan bahwa pengguna tidak dapat memperbarui lokasi /posts/ (melalui referensi langsungnya) tanpa mengisi users/UID/posts/ atau sebaliknya?


person towi_parallelism    schedule 01.03.2016    source sumber


Jawaban (1)


Ada banyak kemungkinan "aturan bisnis" seperti itu, jadi saya akan memilih satu dan menerapkannya. Katakanlah postingan apa pun yang dirujuk pengguna harus ada. Jadi Anda hanya dapat menulis ke /users/myuid/posts/mypostid jika /posts/mypostid ada. Saya juga akan menerapkan validasi dasar postingan itu sendiri.

{
  "posts": {
    "$postid": {
      ".validate": "hasChildren(['title', 'content'])",
      "title": {
        ".validate": "newData.isString()"
      },
      "content": {
        ".validate": "newData.isString()"
      },
      "$other": {
        ".validate": false
      }
    }
  },
  "users": {
    "$uid": {
      "posts": {
        "$postid": {
          ".validate": "newData.parent().parent().parent().parent().child('posts').child($postid).exists()
        }
      }
    }
  }
}

Trik terbesar di sini adalah newData.parent().parent()... bit, yang memastikan bahwa kita mendapatkan postingan di data baru.

Anda mempunyai kebiasaan menanyakan hal-hal seperti "bagaimana saya dapat memastikan bahwa metode ABC digunakan untuk memperbarui data?", yang jarang merupakan cara berpikir yang tepat. Dalam aturan di atas saya fokus pada memvalidasi struktur data dan benar-benar tidak peduli panggilan API apa yang mungkin mengarah ke data tersebut.

person Frank van Puffelen    schedule 01.03.2016
comment
Terima kasih Frank, saya menggunakan pendekatan serupa, tetapi saya bingung dengan penggunaan newData.val() alih-alih exists().. omong-omong, saya baru saja menambahkan bagian sumber pembaruan untuk memperjelas bagi pembaca bahwa saya' Saya mencari solusi sisi server yang menjamin keluaran yang tepat, tidak peduli apa yang terjadi di sisi klien... tapi terima kasih atas jawabannya. Memecahkan masalah saya :) - person towi_parallelism; 01.03.2016
comment
Jika Anda sudah mempunyai pendekatan yang tidak berhasil, selalu posting pertanyaan Anda. Ini menunjukkan bahwa Anda sudah mencoba sesuatu, ditambah lagi memungkinkan kami menyalin/menempelkan cuplikan ke dalam jawaban kami. - person Frank van Puffelen; 01.03.2016
comment
mengacu pada pertanyaan ini, dapatkah newData.parent()... digunakan beberapa kali di dalam aturan ".validate" pada node tertentu? - person Andrey; 21.10.2016