如何使用ember数据处理服务器响应错误

时间:2013-07-13 07:23:58

标签: ember.js ember-data

  1. 如果ember-data的当前默认预期响应是200以外的,那么它是什么?所以它不会抛出未捕获的异常,而是解析错误以供以后使用?

    e.g。 {“errors”:{jsonerror}} ???

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

  3. 谢谢!

2 个答案:

答案 0 :(得分:16)

@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();
  }
});

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

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

考虑到默认情况下,一旦在events哈希上定义的处理程序处理它就会停止冒泡。但是要继续将事件冒泡到ApplicationRoute,您应该从该处理程序返回true,这样它就可以通知更多的error处理程序,然后您可以从中重新进行转换到transition.retry()的路线。

更新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);
    }
  }
});

希望这会对你有所帮助。

答案 1 :(得分: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 param可让您访问reason.responseTextreason.statusreason.statusText等....