Verlassen der Kette der routenspezifischen Middleware in express / nodejs

8

Ich habe eine Kette von "routenspezifischer Middleware" für diese Route, so:

%Vor%

[mw1, mw2] sind die Middleware, die für die Route /some/path spezifisch ist.

Dies unterscheidet sich von der serverweiten Middleware wie folgt:

%Vor%

Wo gilt es für alle definierten Routen.

Jetzt ist mein Problem, dass ich die Kette verlassen möchte. I.e. Wenn success in mw1 falsch ist, möchte ich nicht, dass mw2 aufgerufen wird. Wenn success in mw2 falsch ist, kann ich nicht für die route-Funktion aufrufen. Zurzeit scheinen sowohl mw1 als auch mw2 aufgerufen zu werden, ob next() aufgerufen wird - und ich weiß nicht warum.

Wie kann ich das machen?

    
bguiz 21.06.2013, 09:48
quelle

3 Antworten

1

Ein bisschen mehr Basteln ergab die Antwort:

%Vor%

Der Trick wurde eine Antwort gesendet: resp.send(406, 'Invalid because of this');

Kurz vor dem Zerstören der Verbindung: req.connection.destroy();

In der Tat nicht die Verbindung zu zerstören, fand ich auch im allgemeinen Fall zu arbeiten.

(Aber war in meinem speziellen Fall erforderlich, und ist nicht in den Rahmen dieser Frage.)

Wenn die Antwort bereits gesendet wurde, ruft express nicht automatisch next() für Sie auf, wie es sonst zu tun schien.

    
bguiz 21.06.2013, 16:11
quelle
17

Sie können next( 'route' ) aufrufen, wie auf der Express-API-Referenz, Abschnitt application routing :

  

Es können mehrere Rückrufe gegeben werden, alle werden gleich behandelt und verhalten sich   genau wie Middleware, mit der einen Ausnahme, dass diese Rückrufe möglicherweise   Rufen Sie next('route') auf, um die Callback (s) der verbleibenden Route zu umgehen.

Beispiel

%Vor%     
laconbass 21.06.2013 09:56
quelle
1

Ich hatte den Eindruck, dass, wenn Sie weder next() aufrufen noch eine Antwort in einer Route-Handling-Funktion senden, Express einfach hängen bleibt. Auch FWIW habe ich kein Array benutzt, meins sieht aus wie server.post('/some/path', mw1, mw2, function(req, resp) {...

Wie auch immer. Eine Alternative könnte darin bestehen, Ihren Code so umzustrukturieren, dass Sie nur eine einzige Verarbeitungsfunktion haben. Haben Sie einen guten Grund dafür, dass mw1 und mw2 Middleware sind statt regulärer asynchroner Funktionen, die Ihr Handler aufruft?

%Vor%     
Plato 21.06.2013 14:24
quelle