2016-07-16 6 views
2

Ich habe ein paar Route wie folgt aus:Laden Sie spezifische Middlewear statt next();

app.post('/user/me',  c.auth, c.striper.make,  c.user.edit,  c.user.requestDriver,  render); 
app.post('/user/:id',  c.auth, c.targetUser,  c.user.makeDriver, c.user.makeAdmin,   render); 

Wenn die Validierung fehlschlägt, möchte ich alle middlewear überspringen und führen Sie die Render-Funktion, mit req, res ich nicht next(); für das, weil ich verwenden kann, nicht wissen, wo in der Reihenfolge ich bin, gibt es eine andere Art und Weise eine bestimmte Funktion mit den Parametern aufrufen res, req and next(); (meine Validierung haben keinen Zugriff auf diese Parameter, so kann ich nicht nur tun

render(res, req, next) 

Vielleicht eine Möglichkeit, das Middlewear-Setup in Routen zu ersetzen:

Antwort

2

Ich schlage Rufen Sie next(new Error(smth-data)); und Rendern in Error-Middleware mit 4 Parametern. Oder möchtest du für jede Route ein spezielles Rendering?

+0

das klingt nach dem, was ich suche! Wird das etwas genannt oder gibt es irgendwelche Dokumente? Was macht neuer Fehler (etw-data)? – Himmators

+0

Ich bin nicht mehr Docs auf Express-Website gefunden, aber es ist Standard-Methode, die keinen zusätzlichen Code erfordern: einfach nächsten Aufruf mit Fehler und unterbrechen Sie es in Fehler-Middleware (http://expressjs.com/en/guide/error -handling.html). –

+0

was bezieht sich auf etw? – Himmators

0

Nach dem Ausgraben des Stack-Überlauf fand ich this post. Es kann dir einen Hinweis geben.

Grundsätzlich Wenn Sie 4 Parameter wie dies

function (err, req, res, next) {} 

nehmen machen machen dann können Sie in der Lage sein, dort zu springen durch Fehler zum nächsten() über ähnliche

next({ type: 'database', error: 'datacenter blew up' }); 
0

Es gibt zahlreiche Möglichkeiten, dies zu erreichen. Eine Möglichkeit wäre, .bind() zu verwenden, um die render Funktion an jede Ihrer Middleware-Funktionen zu übergeben. Wenn Sie dann entscheiden, die Anfragekette zu beenden, können Sie einfach render() anrufen und nicht next() anrufen.

app.post('/user/me', c.auth.bind(null, render), c.striper.make.bind(null, render), 
    c.user.edit.bind(null, render), c.user.requestDriver.bind(null, render), render); 

Dadurch wird ein neues Argument für die Render-Callback zu Beginn jeder Ihrer Middleware-Funktionen hinzufügen, so dass Sie nur, dass zu ihrer Erklärung hinzufügen, und dann haben Sie Zugriff auf die render() Funktion gewünscht und es bei Bedarf aufrufen .


Ein anderer Weg, es zu tun ist, eine neue Middleware zu schaffen, die render Funktion zum req Objekt kommt noch hinzu, so dass es für alle die Middleware dann zur Verfügung steht, so dass Sie es so nennen kann, wann immer Sie wollen.

app.post('/user/me', setReqArg("renderFn", render), c.auth, c.striper.make, c.user.edit, c.user.requestDriver, render); 

function setReqArg(propName, propValue) { 
    return function(req, res, next) { 
     req[propName] = propValue; 
     next(); 
    } 
} 

Nachdem diese Weise können alle Middleware-Zugriff auf die Render-Funktion bei req.renderFn zu bekommen.

Verwandte Themen