每次用户在chatApp中发送消息时,我都会尝试复制此数据结构:
{
entries: {
users: {
"twitter username": {
"unique key assigned by firebase": {
name: "twitter username",
text: "whatever which user writes"
}
}
}
}
}
所以我尝试了这个:
var entryRef = new Firebase('https://ranchat.firebaseio.com:443/entries/users/');
var messagesRef = entryRef.child(name);
// When the user presses enter on the message input, write the message to firebase.
$('#messageInput').keypress(function (e) {
if (e.keyCode == 13) {
// You shouldn't allow an empty entry
var text = $('#messageInput').val();
messagesRef.push({name:name, text:text});
$('#messageInput').val('');
}
});
(Here is the whole code of my app)
但消息只是发送到firebase一次。也就是说,我可以在<input>
上写一条消息,按 Enter 并将其发送到Firebase(the data appear in it),但如果我想重复相同的操作,则数据不会出现在其中。由于用户必须使用Twitter登录才能发送消息,我尝试从其他会话发送数据(使用其他Twitter帐户登录)但是它不起作用;在第一条消息之后,没有人可以发送数据,既不是同一个用户也不是另一个用户。
在我尝试向Firebase发送另一封邮件的那一刻,我在JS控制台中收到此错误:
"FIREBASE WARNING: set at /entries/users/jobsamuel/-JHXOGvd2Gw1Z8UAZ5X8 failed: permission_denied "
我不知道我做错了什么,或者我不做什么。
答案 0 :(得分:1)
我在Firebase Forge的安全规则中修改了data.exists()
验证,它可以运行:
{
"rules": {
".read": true,
"$comment": {
".write": "!data.exists() && newData.child('twitter_id').val() == auth.id"
}
}
}
问题是! 。当我复制Firebase简单登录(Twitter)的auth有效负载时,我没有意识到可能的后果。现在,根据此规则,数据将按我的要求发送:
{
"rules": {
".read": true,
".write": "data.exists() && newData.child('twitter_id').val() == auth.id"
}
}
-
但并非所有这一切都是完美的。我不明白两件事。
第一个:使用新规则,如果root directory is empty,我无法将数据发送到Firebase。我只需要.push()
或.set()
之前的内容。
第二个:我需要在我的Firebase参考中的 .com 之后添加:;如果我不放:并且我不知道原因,则不会发送数据。
var entryRef = new Firebase('https://ranchat.firebaseio.com:/entries/');
var messagesRef = entryRef.child(name).child('messages');
// When the user presses enter on the message input, write the message to firebase.
$('#messageInput').keypress(function (e) {
if (e.keyCode == 13) {
// You shouldn't allow an empty entry
var text = $('#messageInput').val();
messagesRef.push({name:name, text:text});
$('#messageInput').val('');
}
});
嗯......到目前为止,我觉得我很好。谢谢你的帮助!