2014-11-25 11 views
14

Mam app węzeł siedzi jak firewall/dyspozytora przed innymi usługami mikro i wykorzystuje łańcuch middleware jak poniżej:Wykluczenie trasy z wyraźną 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 
... 

Jednakże w odniesieniu do danej trasie GET chcę pomiń wszystkie z nich oprócz rateLimiter i proxy. Czy jest sposobem na ustawienie filtru takiego jak Rails before_filter za pomocą: except /: only?

+3

Użytkownik może używać "express-unless" npm do tego celu. –

Odpowiedz

41

Mimo że nie ma wbudowanego systemu filtrów pośrednich w ExpressJach, można to osiągnąć na co najmniej dwa sposoby.

Pierwsza metoda jest zamontowanie wszystkich middleware, że chcesz przejść do zwykłej ścieżki ekspresji niż obejmuje negatywny odnośnika:

// 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); 

Druga metoda, prawdopodobnie bardziej czytelny i czystsze jeden, jest owinąć middleware z mała funkcja pomocnika:

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); 

Jeśli potrzebujesz większej wydajności dopasowanie trasy niż proste path === req.path można użyć path-to-regexp module która jest używana wewnętrznie przez Express.

+0

Poręczna, ale prosta funkcja. Dzięki! –

7

Można również pominąć drogę takiego stanu poprzez umieszczenie na req.originalUrl:

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

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

używam tego wyrażenia regularnego z sukcesu: /^\/(?!path1|pathn).*$/.

1

Możesz zdefiniować niektóre trasy, jak poniżej.

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

    //A personal middleware 
    //code 

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

Witam, proszę dodać wyjaśnienie do odpowiedzi, a także sformatować kod. Zobacz https://stackoverflow.com/help/formatting, aby uzyskać więcej informacji. – Chaithanya