2016-06-10 10 views
2

Ich habe eine Route, die zuerst die Datenbank abfragen müssen, dann mit den Ergebnissen, einen anderen Webdienst abfragen, dann mit diesem Ergebnis rendern die Seite. Ich habe diesen Fluss ausgearbeitet und versuche herauszufinden, die Fehlerbehandlung. Da ich mit mehreren Diensten rede, versuche ich den Fehler zu massieren, bevor ich ihn zurückgebe. HierexpressJS Versprechen und Fehlerbehandlung

ist die Struktur des Codes für die Route:

Models.Episode.findById(request.params.episodeID) 
    .catch(function (error) { 
     throw (throwjs.notFound()); 
    }) 
    .then(function (episode) { 
     if (episode.getUser().id !== request.user.href) { 
      return next(throwjs.unauthorized("You do not have access to this podcast")); 
     } 
     return doSomeOtherAsyncStuff(); 
    }) 
    .then(function (queryResponse) { 
     renderPage(); 
    }) 
    .catch(function (error) { 
     next(error); 
    }); 

Mein Problem mit dem ersten Haken ist. Mein Ziel bei diesem Haken ist es, den Fehler neu zu packen und die Ausführung zu stoppen und den Fehler an Middleware zu senden.

Mit der Art, wie es oben geschrieben ist, stoppt die Ausführung, aber meine Express-Fehlerbehandlung wird nicht aufgerufen.

Ich habe versucht, den ersten Fang als

.catch(function(error){ 
    return next(error); 
}) 

Umschreiben Aber das das Problem nicht lösen. Die einzige Lösung, die ich gefunden habe, ist, den Haken bis zum Ende zu bewegen. Aber dann verliere ich den Kontext der Fehlerstelle.

Irgendwelche Hinweise, was ich falsch mache? Danke, olivier

+0

Haben Sie tatsächlich den ersten Fang wie in Ihrem Beispiel geschrieben? weil es einen Tippfehler gibt. – Seth

+0

@Seth Guter Punkt, ich habe versucht, nur um sicher zu gehen, mit dem Tippfehler behoben und bekam das gleiche Problem. – otusweb

+0

@ t.niese durch den Fang früh im Thread, ich weiß, das einzige, was fehlgeschlagen ist die obige Aussage. Wenn ich den Fang nur unten anlege, bin ich mir nicht sicher, was fehlgeschlagen ist. – otusweb

Antwort

2

Ich würde empfehlen, einen anderen Ansatz zu verwenden, so dass Sie sich nicht auf lang laufende Versprechen Ketten verlassen müssen. Mit dem folgenden Ansatz haben Sie Ihre Autorisierung und Validierung von der separaten Middleware abgekoppelt, da sie nicht unbedingt ein Problem des eigentlichen Episodenhandlers sind. Außerdem ist dieser Ansatz eher auszudrücken.

Ein zusätzlicher Bonus besteht darin, dass Sie Fehler bis zu einem Fehlerhandler übergeben können, so dass Sie Ihre Fehler von Ihren Routenhandlern weiter entkoppeln.

function validateEpisode(req, res, next) { 
    Models.Episode 
    .findById(req.params.episodeID) 
    .then(function(episode) { 
     req.yourApp.episode = episode; 
     next() // everything's good 
    }) 
    .catch(function(error) { 
     // would be better to pass error in next 
     // so you can have a general error handler 
     // do something with the actual error 
     next(throwjs.notFound()); 
    }); 
} 

function authUserByEpisode(req, res, next) { 
    if (req.yourApp.episode.getUser().id !== req.user.href) { 
    next(throwjs.unauthorized("You do not have access to this podcast")); 
    } 

    next(); // authorized 
} 

function episodeController(req, res) { 
    // do something with req.yourApp.episode 
} 

app.get('/episode/:id', validateEpisode, authUserByEpisode, episodeController) 
+0

Interessant. Ich muss damit experimentieren. Ich bin immer noch ziemlich neu bei dieser ganzen Express-Sache. Vielen Dank! – otusweb

0

Gut schließlich ist dies im Zusammenhang mit dem throwjs Rahmen Ich verwende und die Tatsache, dass ich falsch

throw (throwjs.notFound()); 

sollte

throw (new throwjs.notFound()); 

sein mit ..