我正在尝试在我的ember应用程序中捕获404错误,并重定向到/未找到.
我的ApplicationController有一个错误的动作,我也有一个RSVP.on(‘error’)功能,但404没有被抓住.我只是从jQuery得到一个404错误抛出到我的控制台,但错误没有被传递给错误处理程序.
错误初始化器:
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."; } }
解决方法
如果要使用错误事件,则将其处理程序放在应用程序路由中的操作哈希中.
或者,考虑使用错误路由.您可以在pods / application / error中定义这个模板,路径和控制器,就像任何其他路由一样.请参见http://guides.emberjs.com/v1.10.0/routing/loading-and-error-substates/#toc_code-error-code-substates.错误代码将作为其模型传递给该错误路由.
最后,在许多情况下,最简单可靠的是从查找中捕获错误.
model: function(params,transition) { return this.store.find('location',params.location_id) . catch(err => this.send('ajaxError',err)); }
然后在您的应用程序路由上定义ajaxError操作,该操作与您现在在错误钩子中执行的相同类型的操作相同.但是,这只会捕获到ajax错误,而不是在转换期间可能发生的其他类型的错误,并且被吞入(或者在您的情况下由Ember.RSVP.on(‘error’)报告.