Firebase,多位置更新
Firebase, multi location updates
考虑以下在 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);
}
});
这种方法可用于在不同位置更新 post,但如何在服务器端强制执行原子更新? (通过规则)。
如何确保用户在不填充 users/UID/posts/
的情况下无法更新位置 /posts/
(通过其直接引用),反之亦然?
有很多可能的 "business rules",所以我会选择一个并实现它。假设用户引用的任何 post 都必须存在。因此,如果 /posts/mypostid
存在,您只能写入 /users/myuid/posts/mypostid
。我还将对 post 本身进行基本验证。
{
"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()
}
}
}
}
}
这里最大的技巧是newData.parent().parent()...
位,它确保我们得到新数据中的posts。
您有问 "how can I ensure that method ABC was used to update the data?" 之类问题的习惯,这很少是正确的思考方式。在上面的规则中,我专注于验证数据的结构并且真的不关心什么 API 调用可能导致该数据。
考虑以下在 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);
}
});
这种方法可用于在不同位置更新 post,但如何在服务器端强制执行原子更新? (通过规则)。
如何确保用户在不填充 users/UID/posts/
的情况下无法更新位置 /posts/
(通过其直接引用),反之亦然?
有很多可能的 "business rules",所以我会选择一个并实现它。假设用户引用的任何 post 都必须存在。因此,如果 /posts/mypostid
存在,您只能写入 /users/myuid/posts/mypostid
。我还将对 post 本身进行基本验证。
{
"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()
}
}
}
}
}
这里最大的技巧是newData.parent().parent()...
位,它确保我们得到新数据中的posts。
您有问 "how can I ensure that method ABC was used to update the data?" 之类问题的习惯,这很少是正确的思考方式。在上面的规则中,我专注于验证数据的结构并且真的不关心什么 API 调用可能导致该数据。