ruby-on-rails - 2015 年重新审视 Ember 处理 401

标签 ruby-on-rails ember.js error-handling ember-data

我可以在 Ember/Ember Data 中找到大量询问/回答如何从 Rails 后端处理 401 的老问题。许多,如果不是全部的话,在这一点上似乎已经过时了。我已经尝试了我能找到的一切。 (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 的几种变体.
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钩。任何未处理的 Promise 拒绝都将最终陷入困境。如果您使用的是 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
      }
    };
  }
}

如上所述,这将处理所有未捕获的 Promise 拒绝。因此,这仍然为您在组件中本地处理 Promise 提供了很大的灵 active 。例如:
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;
        }
      })
    }
  }
 });

请注意,在上面的 promise 拒绝处理程序中,如果我们无法处理错误,我们会重新抛出它。这个非常重要。重新抛出错误将使任何额外的链式 Promise 处理程序有机会处理它。最终它将达到Ember.onerror如果不处理。

关于ruby-on-rails - 2015 年重新审视 Ember 处理 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29926638/

相关文章:

ember.js - ember-data 海关序列化

django - Django图像上传表单未显示错误消息

javascript - 在 javascript 中设置属性时未捕获类型错误

ruby-on-rails - Rails ActiveRecord : pretty errors when deleting dependent entities with foreign keys constraints

jquery - 在我的 Rails 3 应用程序中实现 jQuery Masonry 时遇到问题

ruby-on-rails - 在代理键存在的情况下,我应该如何为域约束定义复合外键?

binding - 在各种过滤选项之间切换的正确 emberjs 方式是什么?

eclipse - Handlebars js 编辑器。

swift - “ fatal error :在展开可选值时意外发现nil”是什么意思?

ruby-on-rails - Rails 自定义验证 - 只有一条记录可以为真