So implementieren Sie eine ordnungsgemäße globale HTTP-Fehlerbehandlung in ember

7

Was ich will: eine Fehlerbehandlung, die global verschiedene http-Fehler (401, 404, 500) behandelt. Es sollte nicht wichtig sein, wo oder wann ein HTTP-Fehler auftritt.

Bisher habe ich eine Fehleraktion in der Anwendungsroute implementiert, die bei jedem Adapterfehler auf dem model -Hook der Route aufgerufen wird. Das funktioniert gut.

Was nicht behandelt wird, ist der Fall, wenn ich mit Datensätzen in anderen Kontexten wie record.save() arbeite. Dort muss ich den Fehler auf dem Versprechen separat behandeln.

Außerdem möchte ich nicht nur einen Standardfehlerhandler haben, sondern eher einen Fallback.

Ok, bevor wir zu viel reden, haben wir eine Beispielimplementierung meiner Anwendungsfälle.

Anwendungsroute

Die Anwendungsfehleraktion sollte der Standard / Fallback-Fehlerhandler sein.

%Vor%

Eine Route

In diesem Fall wird die Anwendungsfehleraktion aufgerufen.

%Vor%

Einige Controller

In diesem Fall wird die Anwendungsfehleraktion NICHT aufgerufen.

(Ich weiß, der folgende Code macht wahrscheinlich keinen Sinn, aber er soll nur meine Anforderungen veranschaulichen)

%Vor%

Ein anderer Controller

In diesem Beispiel wird die Anwendungsfehleraktion sicher nicht aufgerufen, da ich hier meinen eigenen Handler verwende ( catch() ). Aber wie Sie in den Kommentaren sehen können, möchte ich den Standard-Handler für alle anderen Statuscodes als 404 verwenden.

%Vor%

Gibt es also einen sauberen und genehmigten Weg, das zu erreichen? Ich hoffe, ich konnte dir mein Problem klar machen.

    
val 18.08.2015, 17:29
quelle

2 Antworten

5

Sie können versuchen, etwas mit diesen Ereignissen zu tun (setzen Sie diese Zeilen vor der App-Initialisierung in app.js):

%Vor%

Ich habe von Ссылка etwas über sie erfahren. Vielleicht finden Sie hier einige Details dort.

    
Gennady Dogaev 18.08.2015, 18:17
quelle
13

Ich denke, ich habe meine endgültige Lösung, die ich mit dir teilen möchte. Im Grunde nahm ich die Ideen der Jungs, die meine Frage kommentierten und sie so erweiterten, dass sie meinen Bedürfnissen entsprachen.

Zuerst habe ich ein Mixin mit der Hauptlogik erstellt. Da ich möchte, dass es so allgemein wie möglich ist, unterscheidet es zwischen a) Controller / Route und b) jquery / Adapterfehler. Es spielt also keine Rolle, von wo Sie es aufrufen und ob Ihr Fehlerobjekt ursprünglich von einer Jquery-Ajax-Anfrage oder einem Ember-Adapter stammt.

%Vor%

Als nächstes habe ich einige Klassen (in app.js) wieder geöffnet, um diese Funktionalität global verfügbar zu machen:

%Vor%

Schließlich habe ich einige Aktionen zur Anwendungsroute hinzugefügt:

%Vor%

Warum habe ich zwei Aktionen, die dasselbe machen? Nun, die Aktion error wird bei Fehlern auf dem Modellhook der Route aufgerufen. Ich könnte bei dieser Aktion bleiben, aber im Rest der Anwendung, wo ich diese Aktion explizit nenne, möchte ich einen aussagekräftigeren Namen. Daher habe ich auch eine ajaxError Aktion erstellt. Du könntest sicher mit einer Aktion bleiben.

Jetzt können Sie das überall verwenden:

Route / Controller :

this.ajaxError(error);

Komponente :

this.sendAction('ajaxError', error);

Natürlich müssen Sie die Aktion auch an die Komponente übergeben, die von der Anwendungsroute behandelt werden soll:

{{some-component ajaxError="ajaxError"}}

Dies funktioniert auch für verschachtelte Komponenten. Sie müssen diese Aktion nicht explizit in der Datei component.js weiterleiten, da wir die Komponente erneut geöffnet und diese Aktion in

eingefügt haben

Ich hoffe, ich kann anderen Leuten bei dieser Implementierung helfen. Auch jede Rückmeldung ist willkommen.

    
val 20.08.2015 13:06
quelle

Tags und Links