2014-11-25 14 views
14

ich ein Knoten App wie eine Firewall/Dispatcher vor anderen Mikro Dienste sitzen und es verwendet eine Middleware-Kette wie unten:ausschließen Route von Express Middleware

... 
app.use app_lookup 
app.use timestamp_validator 
app.use request_body 
app.use checksum_validator 
app.use rateLimiter 
app.use whitelist 
app.use proxy 
... 

jedoch für eine bestimmte Route planen ich will Überspringe alle außer rateLimiter und proxy. Ist es eine Möglichkeit, einen Filter wie einen Rails before_filter zu setzen, indem man: except /: only verwendet?

+3

Sie können zu diesem Zweck 'express-unless' npm verwenden. –

Antwort

41

Auch wenn es kein build-in-Middleware-Filtersystem in Express.js, können Sie diese in mindestens zwei Wegen erreichen.

Erste Methode ist es, alle Middle zu montieren, die Sie zu einem regulären Ausdruck Pfad überspringen wollen als einen negativen Nachschlag umfasst:

// Skip all middleware except rateLimiter and proxy when route is /example_route 
app.use(/\/((?!example_route).)*/, app_lookup); 
app.use(/\/((?!example_route).)*/, timestamp_validator); 
app.use(/\/((?!example_route).)*/, request_body); 
app.use(/\/((?!example_route).)*/, checksum_validator); 
app.use(rateLimiter); 
app.use(/\/((?!example_route).)*/, whitelist); 
app.use(proxy); 

Zweite Methode, wahrscheinlich besser lesbar und sauberere ein, ist Ihre Middleware wickeln mit eine kleine Hilfsfunktion:

var unless = function(path, middleware) { 
    return function(req, res, next) { 
     if (path === req.path) { 
      return next(); 
     } else { 
      return middleware(req, res, next); 
     } 
    }; 
}; 

app.use(unless('/example_route', app_lookup)); 
app.use(unless('/example_route', timestamp_validator)); 
app.use(unless('/example_route', request_body)); 
app.use(unless('/example_route', checksum_validator)); 
app.use(rateLimiter); 
app.use(unless('/example_route', whitelist)); 
app.use(proxy); 

Wenn Sie mehr leistungsfähige Routenanpassung benötigen als einfache path === req.path können Sie path-to-regexp module verwenden, die intern von Express verwendet wird.

+0

Handliche, aber einfache Funktion. Vielen Dank! –

7

Sie können auch Route wie diese überspringen, indem Sie eine Bedingung auf req.originalUrl setzen:

app.use(function (req, res, next) { 

    if (req.originalUrl === '/api/login') { 
    return next(); 
    } else { 
     //DO SOMETHING 
    } 
3

Ich benutze diesen regulären Ausdruck mit Erfolg: /^\/(?!path1|pathn).*$/.

1

Sie können einige Routen definieren, wie unten.

app.use(/\/((?!route1|route2).)*/, (req, res, next) => { 

    //A personal middleware 
    //code 

    next();//Will call the app.get(), app.post() or other 
}); 
+0

Hallo, bitte fügen Sie eine Erklärung zu Ihrer Antwort hinzu und formatieren Sie auch Ihren Code. Weitere Informationen finden Sie unter https://stackoverflow.com/help/formatting. – Chaithanya

Verwandte Themen