【问题标题】:How to handle server response errors with ember data如何使用 ember 数据处理服务器响应错误
【发布时间】:2013-07-11 18:25:01
【问题描述】:
  1. 如果 ember-data 得到的不是 200,服务器当前的默认预期响应是什么,因此它不会抛出未捕获的异常,而是解析错误以供以后使用?

    例如{"错误":{jsonerror}} ???

  2. 在 Ember 中我应该如何处理服务器错误响应(json 格式)?

谢谢!

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    @colymba 几乎是正确的,但我会尝试给出更详细的答案,以便帮助您更轻松地启动和运行。

    正如在新的router facelift 中已经说明的那样,当尝试转换到路由时,beforeModelmodelafterModel 的任何钩子都可能抛出错误,或者返回一个拒绝的承诺,在这种情况下,error 事件将在 部分 输入的路由上触发,允许您在每个路由的基础上处理错误。

    App.SomeRoute = Ember.Route.extend({
      model: function() {
        //assuming the model hook rejects due to an error from your backend
      },
      events: {
       // then this hook will be fired with the error and most importantly a Transition
       // object which you can use to retry the transition after you handled the error
       error: function(error, transition) {
         // handle the error
         console.log(error.message);
         // retry the transition
         transition.retry();
      }
    });
    

    如果您希望在应用程序范围内处理错误,您可以通过覆盖ApplicationRoute 上的error 处理程序来定义自己的全局默认error 处理程序,这可能看起来像这样:

    App.ApplicationRoute = Ember.Route.extend({
      events: {
        error: function(error, transition) {
          // handle the error
          console.log(error.message);
        }
      }
    });
    

    请注意,默认情况下,一旦在 events 哈希上定义的处理程序处理事件,事件就会停止冒泡。但是要继续将事件一直冒泡到ApplicationRoute,您应该从该处理程序返回true,以便它可以通知更多error处理程序,然后您可以从中重试以转换到带有@987654336 的路由@。

    ember 1.0 及更高版本的更新

    自新的 ember 版本 1.0 起,events 哈希已重命名为 actions。路由的错误处理程序现在应该在 actions 哈希中:

    App.ApplicationRoute = Ember.Route.extend({
      actions: {
        error: function(error, transition) {
          // handle the error
          console.log(error.message);
        }
      }
    });
    

    希望对你有所帮助。

    【讨论】:

    • 感谢您的帮助!不过,我还有一个问题,我如何在 ember 中访问来自服务器的 404 响应中的 json 错误?
    • @wonderwall 你能检查error 对象的洞吗?可能存储在不同的属性中
    • 类 {id: "1", store: Class, _reference: Object, stateManager: Class, _changesToSync: Object...} ember1373755186212: "ember380" __ember1373755186212_meta: Meta _changesToSync: Object _reference: Object _super: undefined id: "1" stateManager: Class store: Class toString: function () { return ret; } 事务:类 __proto:对象
    • 顺便说一句,我在 Ember.js 1.0.0-rc6 上
    • 好吧,我用 ember-data 挖了一圈,可悲的是,它还不能得到后端返回的错误......你只会被通知根本有一个错误,另见这个答案供参考:stackoverflow.com/questions/15569778/…,对不起:(
    【解决方案2】:

    在最新的路由器中,错误会冒泡到路由器并可以在

    events: { error: function(error, transition){}}

    路由器上的钩子在与路由器上的model 钩子一起使用时效果很好...有关详细信息和示例,请参阅https://gist.github.com/machty/5647589..

    编辑:

    在 Ember-data 中,我使用了自定义

    DS.rejectionHandler = function(reason) {
      Ember.Logger.assert([reason, reason.message, reason.stack]);
      throw reason;
    };
    

    https://github.com/emberjs/data/blob/master/packages/ember-data/lib/adapters/rest_adapter.js

    reason 参数让您可以访问reason.responseTextreason.statusreason.statusText 等......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-25
      • 2015-10-26
      • 1970-01-01
      • 2019-08-14
      相关资源
      最近更新 更多