我希望我的 Emberjs 应用程序能够处理未经授权的 HTTP 状态 (401)。
该应用程序使用 ember-data 来集成 JSON API (Rails)。
客户端层 (Emberjs) 在收到 HTTP 状态未授权 (401) 时应重定向到提示登录的 Emberjs 视图/模板。
如何为整个应用程序执行此操作?
我希望我的 Emberjs 应用程序能够处理未经授权的 HTTP 状态 (401)。
该应用程序使用 ember-data 来集成 JSON API (Rails)。
客户端层 (Emberjs) 在收到 HTTP 状态未授权 (401) 时应重定向到提示登录的 Emberjs 视图/模板。
如何为整个应用程序执行此操作?
我正在研究同一主题,看起来这里的信息有点过时了。使用 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');
}
}
}
我一直在努力解决同样的问题。我已经成功实现了以下 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),您可以根据这些信息决定做什么。
希望这可以帮助
我在想一个更好的方法是使用 Ember 的承诺:
@store.get("user").then(=>
# Success stuff here
).fail(=>
@transitionTo("login") # Do other fancy error stuff here too
)
这样做的问题是必须在所有路线上单独完成。也许你可以用beforeTransition
方法做一些事情,检查承诺返回什么?只是思考的食物。