Firebase .push() выдает ошибку «permission_denied»

При создании ввода новых данных с помощью .push(), например:

var passes = chatRef.push('passes');
    passes.set({
      userID: FirebaseRef.user.id, 
      gymName: $(this.options.data.gymName.getContent()).text().split(/[ ]+/).join(' '), 
      price: $(this.options.data.price.getContent()).text().split(/[ ]+/).join(' '),
      numDays: window.gymDays
    })

Я получаю следующее предупреждение от Firebase:

ПРЕДУПРЕЖДЕНИЕ FIREBASE: установка в /-JPBDARJ67cnr6Yr_nGZ не удалась: разрешение_отказано

Мои правила безопасности:

{
  "rules": {
    "users": {
      ".write": true,
      "$userid": {
        ".read": "auth.id == $userid",
        ".write": true
      }
    },
    "passes": {
     ".write": true
    }
  }
}

Любая идея, как исправить?


person NateH    schedule 11.06.2014    source источник


Ответы (2)


Проблема здесь возникает, когда вы вызываете var passes = chatRef.push('passes');. На данный момент вы фактически создаете нового дочернего элемента, а не просто получаете доступ к дочерним «проходам». Ваши правила безопасности позволяют писать в "проходы", но не позволяют создавать "проходы".

Чтобы решить проблему, избавьтесь от строки var passes = chatRef.push('passes'); и замените ее на var passes = chatRef.child('passes');. Таким образом, он будет обращаться к дочернему элементу в Firebase, а не создавать его.

ИЗМЕНИТЬ:

Для добавления детей используйте .push():

passes.push({
  userID: FirebaseRef.user.id, 
  gymName: $(this.options.data.gymName.getContent()).text().split(/[ ]+/).join(' '), 
  price: $(this.options.data.price.getContent()).text().split(/[ ]+/).join(' '),
  numDays: window.gymDays
});
person Timothy Smith    schedule 11.06.2014
comment
Спасибо Тимоти. Первоначально я использовал .child(), но каждый раз, когда создавался новый проход, он перезаписывал последний созданный проход, так что в базе данных никогда не было более одного прохода одновременно. По сути, я хочу создать список проходов и добавить каждый новый проход в список. - person NateH; 11.06.2014
comment
Вы можете использовать push({data}) вместо set({data}). - person Timothy Smith; 12.06.2014

Вот рабочий код, использующий .push(), в котором проходы сохраняются для любого пользователя, вошедшего в систему:

var BASE_URL = 'ENTER YOUR FIREBASE URL';
var chatRef = new Firebase(BASE_URL);

var passes = chatRef.child('passes').child(FirebaseRef.user.id);
passes.push({
  userID: FirebaseRef.user.id, 
  gymName: $(this.options.data.gymName.getContent()).text().split(/[ ]+/).join(' '), 
  price: $(this.options.data.price.getContent()).text().split(/[ ]+/).join(' '),
  numDays: window.gymDays
});

А вот как вызывать проходы конкретным пользователем:

var array = []

FirebaseRef.chatRef.child('passes').child(FirebaseRef.user.id).limit(100).on('child_added', function(snapshot) {this.array.push(snapshot.val())}.bind(this)); 
person NateH    schedule 12.06.2014