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

    例如 {"errors":{jsonerror}} ???

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

谢谢!

4

2 回答 2

16

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

正如新路由器改款中已经说明的那样,当尝试转换到路由时,任何钩子beforeModel,modelafterModel可能会抛出错误,或返回拒绝的承诺,在这种情况下,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);
    }
  }
});

希望这对您有所帮助。

于 2013-07-13T12:17:48.557 回答
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.responseText,reason.statusreason.statusText....

于 2013-07-13T11:42:17.030 回答