【问题标题】:Firebase .push() throws 'permission_denied' errorFirebase .push() 抛出“permission_denied”错误
【发布时间】:2014-06-11 19:04:34
【问题描述】:

使用 .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 警告:设置在 /-JPDBARJ67cnr6Yr_nGZ 失败:permission_denied

我的安全规则:

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

知道如何解决吗?

【问题讨论】:

    标签: javascript firebase firebase-security


    【解决方案1】:

    当您调用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
    });
    

    【讨论】:

    • 谢谢蒂莫西。我最初使用的是 .child() 但每次创建新通道时,它都会覆盖创建的最后一个通道,因此数据库中一次不会超过一个通道。我基本上想创建一个通行证列表并将每个新通行证附加到列表中。
    • 你可以使用 push({ data }) 而不是 set({ data })。
    【解决方案2】:

    这是使用 .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)); 
    

    【讨论】:

      猜你喜欢
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      • 2021-12-30
      • 2021-12-02
      相关资源
      最近更新 更多