2015-03-06 13 views
5

Ho un middleware di autenticazione che deve effettuare una chiamata a un servizio esterno e fornire un URL di richiamata. Per esempio:È possibile ottenere l'URL di base per un router express

var express = require('express'); 
var app = express(); 

// This will work just fine 
app.use('/', getAuthRouter()); 

// The redirects here will end up going to /oauth/callback 
// instead of /admin/oauth/callback 
app.use('/admin', getAuthRouter()); 

function getAuthRouter() { 
    var authRouter = express.Router(); 

    // Setup auth routes 
    var callbackUrl = '/oauth/callback'; 
    var loginUrl = '/login'; 

    authRouter.get(callbackUrl, .... }); 
    authRouter.get(loginUrl, function(req, res, next){ 
    // Make call to OAuth server 
    res.redirect("http://authserver/?callback=" + callbackUrl); 
    }); 

    return authRouter; 
} 

Il problema è che authRouter non sa che in realtà è montato sotto /admin quindi non ha modo di anteporre che al callback param.

C'è un modo che posso ottenere che all'interno della funzione getAuthRouter?

+0

È interessante notare che esiste un "app.mountpath" che può essere eseguito, ma solo se si monta un'app secondaria e non un router. Ciò accade a destra [qui] (https://github.com/strongloop/express/blob/master/lib/application.js#L214-L221) – Fotios

risposta

2

Uso req.url:

È possibile utilizzare req.url.
Se si è http://example.com/test/here restituirà /test/here.

passarlo come argomento:

ma nel tuo caso si potrebbe anche passare l'URL di base come parametro di middleware:

function getAuthRouter(baseUrl) { 
    var authRouter = express.Router(); 
    baseUrl = baseUrl || ""; // Default 

    // Setup auth routes 
    var callbackUrl = baseUrl + '/oauth/callback'; 
    var loginUrl = '/login'; 
    // ... 
} 

E ti quindi chiamare in questo modo:

app.use('/admin', getAuthRouter("/admin"));

O

app.use ('/', getAuthRouter()); // Calls default

+0

Grazie per la pronta risposta. Mentre questo è un approccio totalmente valido, volevo evitare di dover passare manualmente qualcosa nel middleware ed era più alla ricerca di un approccio di auto-scoperta. – Fotios

+0

Allora dovresti probabilmente usare il modo 'req.url'! – Telokis

1

Utilizzare request.baseUrl, che è stato progettato per questo caso d'uso.

+0

Questo dovrebbe essere contrassegnato come la risposta – sidonaldson

Problemi correlati