【问题标题】:AngularFire: how to "safely" add an item?AngularFire:如何“安全地”添加项目?
【发布时间】:2014-07-25 05:23:22
【问题描述】:

我正在尝试“安全地”将一个项目添加到我的 Firebase“玩家”集合中,即:检查远程错误(服务器关闭、链接关闭……),以便能够通知用户(临时) 请求的添加操作失败。

这是我当前的代码:

app.factory('playersFactory',
  function($firebase, FIREBASE_URL) {
    var url = FIREBASE_URL + '/' + 'players';
    var ref = new Firebase(url);
    var players = $firebase(ref);

    return {
      add: function(player) {
        return players.$add(player).then(
          function (ref) {
            var id = ref.name();
            console.error('SUCCESS: added player with id:', id);
            return id;
          },
          function (err) {
            console.error('ERROR:', err);
            return null;
          }
        );
      }
      // ...
    }
  }
);

我的问题是:

  • 我的代码有效吗? (我没有找到任何参考资料——当然是我的错——关于捕获 angularfire 错误的建议方法...)。
  • 我使用$add(player).then( 的第二个回调来捕获错误是否有效?我想不是,因为我尝试在“添加”之前模拟拔出网线失败,并且没有显示错误...
  • 真的需要用 Firebase 来捕捉这些错误吗?

【问题讨论】:

    标签: angularjs firebase angularfire


    【解决方案1】:

    这种方法看起来是正确的。 $add 是将项目添加到您希望它们按时间顺序反刍并具有唯一 ID 的理想方式。如您所见,应使用 then() 来捕获错误。

    请注意,您不会因为拔下网线而产生错误。 Firebase 具有容错性,并将在本地应用更改,等待连接恢复后再发送到服务器。您最好通过设置防止写入相关路径的安全规则来创建错误条件。

     ".write": "!newData.child('shouldFail').exists()" // for example
    

    您可能还想查看MockFirebase。它在各个方面都不完整,也没有完美记录,但用于测试 AngularFire。与其他 Angular 模拟(例如 $http)一样,它通过使用 flush() 方法来根据您的判断触发回调,允许您对事件触发的时间进行复杂的控制,以可控的方式模拟异步。还有一个 failNext 方法,目前仅适用于 set(),但需要几分钟才能添加到您需要使用的任何其他方法。

    【讨论】:

    • @加藤:谢谢你的回答!我从未深入研究 Firebase 安全规则... :-( 但是我无法模拟客户端 $add 失败,甚至设置该规则...(我在我的 firebug 控制台中获得了常规的“成功”,并且有效新数据在firebase中......这些是我的安全规则:{“rules”:{“.read”:true,“.write”:“!newData.child('shouldFail').exists()”}}我只需要一种简单的方法快速测试我的逻辑以防失败,所以我最好暂时避免使用 MockFirebase 进行挖掘......
    猜你喜欢
    • 1970-01-01
    • 2017-05-24
    • 2014-05-12
    • 2022-07-21
    • 2013-07-10
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多