2012-10-16 10 views
38

Sto usando il quadro espresso in node.js con alcune funzioni middleware:Usa middleware specifico Express per tutti i percorsi, tranne uno specifico

var app = express.createServer(options); 
app.use(User.checkUser); 

posso utilizzare la funzione .use con un parametro aggiuntivo per utilizzare questo middleware solo su percorsi specifici:

app.use('/userdata', User.checkUser); 

è possibile utilizzare la variabile percorso in modo che il middleware viene utilizzato per tutti i percorsi tranne una specifica, vale a dire il percorso principale?

Sto pensando a qualcosa di simile:

app.use('!/', User.checkUser); 

Così User.checkUser viene sempre chiamato ad eccezione del percorso principale.

risposta

57

Vorrei aggiungere il middleware di checkUser a tutti i miei percorsi, eccetto homepage.

app.get('/', routes.index); 
app.get('/account', checkUser, routes.account); 

o

app.all('*', checkUser); 

function checkUser(req, res, next) { 
    if (req.path == '/') return next(); 

    //authenticate user 
    next(); 
} 

Si potrebbe estendere questo con sottolineatura per cercare la req.path in una serie di percorsi non autenticati:

function checkUser(req, res, next) { 
    var _ = require('underscore') 
     , nonSecurePaths = ['/', '/about', '/contact']; 

    if (_.contains(nonSecurePaths, req.path)) return next(); 

    //authenticate user 
    next(); 
} 
+1

Grazie, ho implementato la soluzione di sottolineatura. – Thomas

+0

È possibile consentire tutte le richieste a un percorso specifico, ma non i percorsi secondari? (ad esempio "/", "/style.css", "/background.jpg", ma non "/ liste /" o "/ titoli") – Thomas

+0

le risorse statiche devono essere fornite da una directory statica. – chovy

7

Invece di registrare direttamente User.checkUser come middleware, registrare una nuova funzione di supporto, ad esempio checkUserFilter, che viene richiamata su ogni URL, ma ha passato l'esecuzione a userFiled` solo su determinati URL. Esempio:

var checkUserFilter = function(req, res, next) { 
    if(req._parsedUrl.pathname === '/') { 
     next(); 
    } else { 
     User.checkUser(req, res, next); 
    } 
} 

app.use(checkUserFilter); 

In teoria, si potrebbe fornire percorsi regexp a app.use. Ad esempio qualcosa come:

app.use(/^\/.+$/, checkUser); 

Provato su espresso 3.0.0rc5, ma non funziona.

Forse potremmo open a new ticket e suggerire questo come una funzione?

1

Usa

app.use(/^(\/.+|(?!\/).*)$/, function(req, resp, next){... 

Questo passaggio qualsiasi url a parte f rom /. A meno che non funzioni per me.

In generale

/^(\/path.+|(?!\/path).*)$/ 

(vedi How to negate specific word in regex?)

Spero che questo aiuti

4

È possibile impostare il middleware uno ogni percorso anche.

// create application/x-www-form-urlencoded parser 
var urlencodedParser = bodyParser.urlencoded({ extended: false }) 

// POST /login gets urlencoded bodies 
app.post('/login', urlencodedParser, function (req, res) { 
    if (!req.body) return res.sendStatus(400) 
    res.send('welcome, ' + req.body.username) 
}) 
+1

Questo è quello che sto cercando !! – Lancelot

Problemi correlati