ember.js - EmberJS/Ember-数据 : 404's Not Getting Caught

标签 ember.js ember-data

我正在 try catch ember 应用中的 404 错误,并重定向到 /not-found

我的 ApplicationController 上有一个 errors 操作,并且我也有一个 RSVP.on('error') 函数,但是 404 的不会被捕获。我刚刚收到 jQuery 向控制台抛出的 404 错误,但该错误并未传递给错误处理程序。

Console Error

错误初始化:

import Ember from 'ember';

var initialize = function(container) {
  var errorReporting = container.lookup("service:errorReporting");

  Ember.RSVP.on('error', function(err) {
    Ember.warn("Ember.RSVP error..... Logging error:");
    console.log(err);
    if (err.name && err.name === 'TransitionAborted') {
      Ember.debug("TransitionAborted error. Doesn't look like we should be catching these.");
    } else {
      container.lookup('route:application').send('error', err);
    }
  });

  window.onerror = function(err) { // window general errors.
    Ember.warn("Uncaught error (tripped window.onerror)..... Logging error:");
    console.log(err);
    errorReporting.report(err);
  };

};

export default {
  name: 'errors',
  initialize: initialize
};

我的 applicationRoute 上的错误操作很大(我可以发布它),但它似乎没有被调用。

编辑 1:路线代码

import Ember from 'ember';
import AuthenticatedRouteMixin from 'simple-auth/mixins/authenticated-route-mixin';

export default Ember.Route.extend(AuthenticatedRouteMixin, {

  titleToken: function(model) {
    return model.get('name');
  },

  model: function(params) {
    return this.store.find('location', params.location_id);
  }

});

编辑 2:ApplicationRoute/错误处理程序

    error: function(err, transition) {
      if (!Ember.isNone(transition)) {
        transition.abort();
      }

      let errorHolder  = this._getErrorDataFrom(err);
      let errorMessage = this._getErrorMessageFrom(errorHolder);
      let isFourOhFour = (typeof(err.status) !== 'undefined' && err.status === 404) || errorHolder.reason === 'not_found';

      if (isFourOhFour) {
        return this.transitionTo('not-found');
      }

      let requireAuthentication = (errorHolder.reason === 'not_authenticated');
      if (requireAuthentication) {
        window.localStorage.setItem('toast-on-reload', errorHolder.message);
        return this.session.invalidate();
      }

      let isValidationError = ( errorHolder.reason === "validation_error" ||
                                ( !Ember.isNone(errorHolder.errors) && !Ember.isNone(errorHolder.message) ) );
      if (isValidationError) {
        this.toast.error(errorMessage);
        return;
      }

      let verificationRequired = (errorHolder.reason === "verification");
      if (verificationRequired) {
        this.toast.error(errorMessage);
        return this.transitionTo('verification');
      }

      let invalidRequest = (errorHolder.reason === 'unprocessable_entity');
      if (invalidRequest) {
        this.toast.error(errorMessage);
        return;
      }

      this.errorReporting.report(errorHolder);
      this.toast.error(errorMessage);
      return this.transitionTo('error');
    }
  },

  _getErrorDataFrom: function(obj) {
    if (!Ember.isNone(obj.responseJSON)) {
      return obj.responseJSON;
    } else if ( !Ember.isNone(obj.success) || !Ember.isNone(obj.errors))  {
      return obj;
    } else if (!Ember.isNone(obj.jqXHR) && !Ember.isNone(obj.jqXHR.responseJSON)) {
      return obj.jqXHR.responseJSON;
    } else {
      Ember.warn("No error handler available, using default ( {} ). Error:");
      console.log(obj);
      return {};
    }
  },

  _getErrorMessageFrom: function(errorHolder) {
    if ( typeof(errorHolder.errors) === 'object' && !Ember.isNone(errorHolder.errors.message) ) {
      return errorHolder.errors.message;
    } else if (!Ember.isNone(errorHolder.errors)) {
      return errorHolder.errors;
    } else if (!Ember.isNone(errorHolder.message)) {
      return errorHolder.message;
    } else {
      return "Sorry, something went wrong.";
    }
  }

最佳答案

如果您想使用error事件,然后将其处理程序放入 actions 中应用程序路由中的哈希值。

或者,考虑使用错误路由。您可以在 pods/application/error 中定义它,具有模板、路由和 Controller ,就像任何其他路由一样。请参阅http://guides.emberjs.com/v1.10.0/routing/loading-and-error-substates/#toc_code-error-code-substates 。错误代码将作为其模型传递到该错误路由。

最后,在许多情况下,catch 是最简单、最可靠的。来自 find 的错误.

model: function(params, transition) {
    return this.store.find('location', params.location_id) .
        catch(err => this.send('ajaxError', err));
}

然后定义ajaxError对您的应用程序路径执行的操作与您在 error 中所做的操作相同现在 Hook 。但是,这只会捕获 ajax 错误,而不会捕获转换期间可能发生的其他类型的错误,并被吞掉(或者在您的情况下由 Ember.RSVP.on('error' 报告)。

关于ember.js - EmberJS/Ember-数据 : 404's Not Getting Caught,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30609757/

相关文章:

ember.js - 查看绑定(bind)Emberjs

javascript - Ember 调用关闭操作

ember.js - 如何在新的Ember数据中进行过滤?另外,过滤器如何比较以在新的 Ember 数据中查找

ember.js - 修改关系时,Ember Data 模型不会变脏

javascript - 在 ember.js 中构建一个极其简单的身份验证系统

binding - Emberjs - 临时禁用属性更改通知

javascript - 简单的客户端框架/模式来简化异步调用?

ember.js - 在哪里放置固定装置?

javascript - Ember Data 一对多关系不起作用

javascript - 使用 Mixins 访问 Ember Controller