implementieren Was ich will: eine Fehlerbehandlung, die global unterschiedliche HTTP-Fehler (401, 404, 500) behandelt. Es sollte nicht wichtig sein, wo oder wann ein HTTP-Fehler auftritt.Wie eine richtige globale HTTP-Fehlerbehandlung in ember
Bisher implementiert ich eine Fehler Aktion in der Anwendung Route, die auf irgendwelchen Adapter Fehler auf der Route des model
Hook aufgerufen wird. Das funktioniert gut.
Was nicht abgedeckt wird, ist der Fall, wenn ich mit Datensätzen in anderen Kontexten wie record.save()
arbeiten. Dort muss ich den Fehler auf dem Versprechen separat behandeln.
Außerdem habe ich nicht nur einen Standardfehlerhandler haben, sondern eher wie ein Rückfall.
Ok, bevor zu viel reden wir ein Beispiel Umsetzung meiner Anwendungsfälle haben.
Anwendung Route
Der Anwendungsfehler Aktion sollte der Standard/Ausweichfehlerbehandlung sein.
actions: {
error: function(error) {
var couldHandleError = false;
if (error.errors) {
switch (error.errors[0].status) {
case '401':
// User couldn't get authenticated.
// Redirect handling to login.
couldHandleError = true;
break;
case '404':
case '500':
// Something went unexpectedly wrong.
// Let's show the user a message
couldHandleError = true;
break;
}
}
// return true if none of the status code was matching
return !couldHandleError;
}
}
Einige Route
In diesem Fall wird die Anwendungsfehler Aktion aufgerufen wird.
model: function() {
return this.store.findAll('post');
}
Einige Controller
In diesem Fall wird die Anwendungsfehler Aktion nicht aufgerufen wird.
(ich weiß, ist der folgende Code wahrscheinlich nicht sinnvoll, aber es sollte nur meine Anforderungen illustrieren)
this.store.findRecord('post', 123);
Einige anderen Controller
In diesem Beispiel wird der Fehler Anwendung Die Aktion wird sicher nicht aufgerufen, da ich hier einen eigenen Handler verwende (catch()
). Aber wie Sie in den Kommentaren sehen kann ich den Standard-Handler für alle Statuscodes anders als 404.
this.store.findRecord('post', 123).catch(function(reason) {
if (reason.errors[0].status === '404') {
// Do some specific error handling for 404
} else {
// At this point I want to call the default error handler
}
});
So ist es eine saubere und genehmigt Art und Weise, dies zu erreichen verwenden wollen? Ich hoffe, ich konnte dir mein Problem klar machen.
Thx, ich werde es morgen versuchen. Klingt gut bis jetzt. – val
Ok, klang gut ... aber jetzt habe ich das Problem, dass ich nicht den Kontext habe, den ich brauche. Zum Beispiel muss ich zu meiner Login-Route umleiten, wenn der Benutzer nicht authentifiziert ist. In meiner Anwendungsroute konnte ich Sachen wie transitionTo() oder controllerFor() machen. Wie könnte ich es mit diesem Ansatz tun? – val
@Valentin, Sie können auch einen Fehler in der Route verwenden. Für Informationen: http://guides.emberjs.com/v2.0.0/routing/loading-and-error-substates/. Lass es mich wissen, wenn es für dich funktioniert. Vielen Dank. – phkavitha