Bra*_*don 10 ember.js ember-data
我试图在我的ember应用程序中捕获404错误,并重定向到/not-found.
我对我有一个errors动作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
};
Run Code Online (Sandbox Code Playgroud)
对我的错误操作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);
}
});
Run Code Online (Sandbox Code Playgroud)
编辑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.";
}
}
Run Code Online (Sandbox Code Playgroud)
小智 11
如果要使用该error事件,则将其处理程序放在actions应用程序路径中的哈希中.
或者,考虑使用错误路由.您可以pods/application/error使用模板,路径和控制器定义此项,就像任何其他路径一样.请参阅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));
}
Run Code Online (Sandbox Code Playgroud)
然后ajaxError在您的应用程序路由上定义操作,该操作error现在执行您在挂钩中执行的相同类型的操作.但是,这只会捕获ajax错误,而不会捕获转换期间可能发生的其他类型的错误,并且会被吞下(或者在您的情况下报告Ember.RSVP.on('error').