我可以在 Ember/Ember Data 中找到大量询问/回答如何从 Rails 后端处理 401 的老问题。许多(如果不是全部的话)在这一点上似乎已经过时了。我已经尝试了我能找到的一切。 (Ember-数据处理 401 https://stackoverflow.com/questions/17981563/ember-data-handling-401-s)
但无论我做什么,我都会在控制台中不断收到 401 错误,而我的代码中永远不会捕获 401 错误。我想要做的就是如果在任何地方/模型/任何地方遇到 401 则将重定向添加到“/”。我不需要任何身份验证或其他任何检查。
我尝试将其添加到应用程序路由操作以及路由器本身。
error: function (error, transition) {
console.log("err: " + error.status);
if (error && error.status === 401) {
return this.transitionToRoute('/');
}
}
我也尝试过这个的几种变体https://stackoverflow.com/a/19063009/1850353 https://stackoverflow.com/a/19063009/1850353.
App.ApplicationAdapter = DS.RESTAdapter.extend({
ajaxError: function(jqXHR) {
var error = this._super(jqXHR);
console.log("jqXHR: " + jqXHR.status);
if (jqXHR && jqXHR.status === 401) {
#handle the 401 error
}
return error;
}
});
我显然是一个菜鸟,所以也许我在这里错过了一些简单的东西。我的 console.log 都不会被触发,除非它是为了我试图让它工作而引入的新错误。是否有当前的“最佳实践”风格的方法来做到这一点?
这里的其他两个答案都很好并且可以正常工作,但恕我直言,有一些不受欢迎的警告。
我强烈建议实施Ember.onerror
钩。任何未处理的承诺拒绝最终都会陷入该困境。如果您使用 Ember-CLI,则可以使用初始化程序来实现它。
// app/initializers/on-error.js
export default {
name: 'on-error',
initialize: function(container, app) {
Ember.onerror = function(error) {
if(error && error.status === 401) {
// Ember 2.1 adds a public lookup function. Older versions
// need to use the container.
var router = app.lookup ? app.lookup('router:main') :
app.__container__.lookup('router:main');
// Even future versions of ember are likely to have an
// accessible router service to do this work.
router.transitionTo('sign-in');
}
if(error && error.stack) {
// Uncaught exception - Log stacktrace to server
}
};
}
}
如上所述,这将处理所有未捕获的承诺拒绝。因此,这仍然为您提供了很好的灵活性,可以在组件中本地处理承诺。例如:
export default Ember.Component.extend({
actions: {
saveChanges: function() {
this.get('model').save().then(null, (reason) => {
if(/* reason is validation error */) {
this.set('validationError', reason.errorMsg);
} else {
throw reason;
}
})
}
}
});
请注意,在上面的承诺拒绝处理程序中,如果我们无法处理错误,我们将重新抛出它。这个非常重要。重新抛出错误将为任何其他链式承诺处理程序提供处理该错误的机会。最终它将达到Ember.onerror
如果不处理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)