5

我希望我的 Emberjs 应用程序能够处理未经授权的 HTTP 状态 (401)。

该应用程序使用 ember-data 来集成 JSON API (Rails)。

客户端层 (Emberjs) 在收到 HTTP 状态未授权 (401) 时应重定向到提示登录的 Emberjs 视图/模板。

如何为整个应用程序执行此操作?

4

3 回答 3

8

我正在研究同一主题,看起来这里的信息有点过时了。使用 Ember 1.7.0,您应该处理路由中的错误。如果您想将此应用于整个应用程序,则应将其添加到您的ApplicationRoute班级,如下所示

// app/routes/application.js
import Ember from 'ember';

var ApplicationRoute = Ember.Route.extend({
    actions: {
        error: function (error, transition) {
            // Handle the error here
            if (error && error.status === 401) {
                return this.transitionTo('login');
            }
        }
    }
});

export default ApplicationRoute;

这与文档描述的方式相同:阅读此处

更新:在较新版本的 Ember 和 Ember Data 中,错误对象结构会有所不同。状态将是一个字符串,包含在错误对象中,在错误数组中:

actions: {
  error: function(error, transition) {
    if (error.errors[0].status === '401') {
      this.transitionTo('sign-in');
    }
  }
}
于 2014-08-28T13:44:55.617 回答
5

我一直在努力解决同样的问题。我已经成功实现了以下 hack。

window.App = Em.Application.extend
  ready: ->
    $(document).ajaxError( (event, request, settings) =>
      if request.status == 401 && !["/profile", "/users/sign_in.json"].contains(settings.url)
        controller = App.__container__.lookup('controller:application')
        controller.transitionToRoute('sign_in' )
)

这个想法是捕获一个 jQuery ajaxError 事件。如果您可以检查错误的类型(例如 request.status == 401)、导致错误的 url(例如 settings.url),您可以根据这些信息决定做什么。

希望这可以帮助

于 2013-04-18T10:21:09.453 回答
0

我在想一个更好的方法是使用 Ember 的承诺

@store.get("user").then(=>
    # Success stuff here
).fail(=>
    @transitionTo("login") # Do other fancy error stuff here too
)

这样做的问题是必须在所有路线上单独完成。也许你可以用beforeTransition方法做一些事情,检查承诺返回什么?只是思考的食物。

于 2014-08-16T22:14:01.563 回答