2013-10-11 11 views
38

Attualmente sto scrivendo un'API che richiede all'utente di passare un token di autenticazione nell'intestazione di ogni richiesta. Ora so che posso creare un percorso catchall direCatch all route EXCEPT per/login

app.get('/*', function(req,res){ 

}); 

ma mi chiedevo come faccio a fare in modo che esso esclude alcune rotte, come /login o /?

+0

E.g Richiedi l'autenticazione su tutte le rotte * eccetto * **/login ** e **/registro **. (Dal momento che le persone si stanno chiedendo perché hai fatto questa domanda) – a20

risposta

62

Non sono sicuro di ciò che si desidera che accada quando un utente accede a /login o /, ma è possibile creare percorsi separati per tali utenti; se li si dichiara prima della catch-all, ottengono dibs prima a gestire le richieste in arrivo:

app.get('/login', function(req, res) { 
    ... 
}); 

app.get('/', function(req, res) { 
    ... 
}); 

app.get('*', function(req, res) { 
    ... 
}); 
+0

Questo funzionerebbe solo per "GET", giusto? Per qualche motivo non riesco a far funzionare questa risposta con 'app.use' (per includere gli altri metodi). –

+2

@SSHQuesto penso che con la versione più recente di Express (v4), 'app.use ('*', ...)' dovrebbe funzionare allo stesso modo. Ma l'uso di [app.all ('*', ...) '] (http://expressjs.com/en/4x/api.html#app.all) è preferibile in questo caso. – robertklep

26

Si può sempre mettere catch-all percorso dopo quelli che si desidera escludere (vedi robertklep risposta).

Ma a volte semplicemente non ti interessa l'ordine dei tuoi percorsi. In questo caso è ancora possibile fare quello che vuoi:

app.get('*', function(req, res, next) { 
    if (req.url === '/' || req.url === '/login') return next(); 
    ... 
}); 
+1

.get ('*', funzione (req, res, next) . –

+1

Grazie mille!! Perché non hai appena modificato il mio post? –

8

Un altro modo per fare un catch-all handler percorso è questo:

app.get('/login', function(req, res) { 
    //... login page 
}); 
app.get('/', function(req, res) { 
    //...index page 
}); 
app.get('/:pageCalled', function(req, res) { 
    console.log('retrieving page: ' + req.params.pageCalled); 
    //... mypage.html 
}); 

Questo funziona esattamente come la risposta di robertklep (accettato), ma ti dà più informazioni su ciò che l'utente ha effettivamente richiesto. Ora hai una lumaca req.params.pageCalled per rappresentare qualsiasi pagina venga richiesta e puoi indirizzare l'utente alla pagina appropriata se ne hai diversi diversi.

Una Gotchya a cui prestare attenzione (thx @agmin) con questo approccio, /:pageCalled prenderà solo percorsi con un solo /, quindi non sarà possibile ottenere /route/1, ecc Utilizzare lumache aggiuntivi come /:pageCalled/:subPageCalled per più pagine (@softcode thx)

+0

MEGLIO? Davvero? Non credi che le circostanze dettino la definizione?) Non correlato: le persone che fanno downvoting senza lasciare un commento: quanto maleducato! – Potherca

+13

c'è un enorme gotchya con questo approccio, '/: pageCalled' catturerà solo i percorsi con un singolo'/', quindi non otterrai'/route/1' ecc. – agmin

+0

Inoltre, se non lo si circonda in un try/catch si otterrà un errore se quella pagina non esiste. – darethas

14

Se si desidera convalidare le credenziali o autenticità in ogni richiesta si dovrebbe utilizzare la funzione di routing espresso "tutto", è possibile utilizzarlo in questo modo:

app.all('/api/*', function(req, res, next){ 
    console.log('General Validations'); 
    next(); 
}); 

è possibile inserire prima di qualsiasi materiale di routing.

Si noti che in questo caso ho utilizzato "/ api/" come percorso, è possibile utilizzare "/" si adatta alle proprie esigenze.

Spero che non sia troppo tardi per aiutare qualcuno qui.

Problemi correlati