2014-11-25 12 views
14

Ho un app nodo seduto come un firewall/dispatcher di fronte agli altri servizi di micro e utilizza una catena di middleware come di seguito:Escludi percorso da middleware di Express

... 
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 
... 

Tuttavia per un particolare percorso GET voglio salta tutti tranne RateLimiter e proxy. È un modo per impostare un filtro come Rails before_filter usando: tranne /: solo?

+3

È possibile l'utente 'express-unless' npm per questo scopo. –

risposta

41

Anche se non esiste un sistema di filtro middleware incorporato in expressjs, è possibile ottenere questo in almeno due modi.

primo metodo è quello di montare tutti i middleware che si desidera passare a un percorso di espressione regolare che include una ricerca negativo:

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

Secondo metodo, probabilmente più leggibile e più pulito, è quello di avvolgere il vostro middleware con una piccola funzione di supporto:

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

Se avete bisogno di route corrispondente più potente della semplice path === req.path è possibile utilizzare path-to-regexp module che viene utilizzato internamente da espresso.

+0

Handy, ma funzione semplice. Grazie! –

7

Si può anche saltare percorso come questo mettendo una condizione sulla req.originalUrl:

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

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

Io uso questa espressione regolare con successo: /^\/(?!path1|pathn).*$/.

1

È possibile definire alcuni percorsi come di seguito.

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

    //A personal middleware 
    //code 

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

Ciao, per favore aggiungi alcune spiegazioni alla tua risposta e anche la formattazione del tuo codice. Per ulteriori informazioni, consulta https://stackoverflow.com/help/formatting. – Chaithanya

Problemi correlati