阅读Firebase数据会返回客户端错误,尽管规则为" true"

时间:2015-05-25 02:18:48

标签: angularjs firebase rest-firebase

我试图找出如何用angular + firebase做一个简单的CRUD。我开始阅读操作。我有以下数据结构:enter image description here

鉴于此,我创建了以下规则: enter image description here

我有一个工作工厂如下:

factory('wordsFactory', function($http){
  var factory = {};
  var words = [
    {content:"hi", definition:"ooo"},
    {content:"h3", definition:"ooo222"}
  ];
  factory.getWords = function(){
    return words;
    //ajax call here
  };
  factory.addWords = function(){
    //something
  }
  return factory;
})

我修改了它以尝试包含这样的调用:

factory('wordsFactory', function($http){
  var factory = {};
  var words = [];
  var ref = new Firebase('https://my-firebase.firebaseio.com/words');
    ref.once('value', function($scope, snapshot) {
        $scope.variable = snapshot.val();
        words = [
          {content: ref.content, definition: ref.definition}
        ];
  });
  factory.getWords = function(){
    return words;
    //ajax call here
  };
  factory.addWords = function(){
    //something
  }
  return factory;
})

但是,每当我尝试阅读时,我都会:

Error: permission_denied: Client doesn't have permission to access the desired data.

FIREBASE WARNING: Exception was thrown by user callback. TypeError: Cannot read property 'val' of undefined

很多事情,我意识到,由于我拥有它的方式,即使它有效,它也只会返回1个值。我现在对此很好,因为我只想弄清楚如何使它工作。我也知道我当前的数据结构可以大大改进,我只是想学习它,但你可以随意提出你认为可以帮助我的任何建议。

我现在主要担心的是我无法阅读。我还要提一下,工厂在没有火基的情况下正常工作,它在主控制器中被调用。

2 个答案:

答案 0 :(得分:1)

我认为您的问题与规则有关。

尝试将默认规则替换为以下内容:

{
  "rules": {    
     ".read": true,
     ".write": true
  }
}

现在您可以在没有任何错误的情况下进行访问。

答案 1 :(得分:0)

我不确定你是怎么来到这个结构的:

ref.once('value', function($scope, snapshot) {

但是once回调只为value事件采用了一个参数。请参阅the relevant Firebase API documentation

所以你必须把它改成:

ref.once('value', function(snapshot) {

找到另一种方法来获得范围。

要对失败的读取操作进行故障排除,建议您使用Firebase信息中心中的模拟器选项卡。它通常会向您显示操作被拒绝的更好解释。这些详细信息有意不在常规客户中显示。