2013-09-29 15 views
11

Sto cercando di fare un middleware per la gestione degli alias url, quello che sto facendo in questo momento è:In App reindirizzare in expressjs utilizzando middleware

// [...] 
module.exports = function() { 

    return function(req, res, next) { 
    // getAlias would get an object {alias:"alias/path",source:"/real/path"} or null 
    var alias = getAlias(req.url); 
    if(alias) { 
     req.url = alias.source; 
    } 
    next(); 
    }; 

}; 

Così basicaly sto cercando in un negozio per l'URL richiesto e se viene trovato come alias, cambio request.url nel percorso di origine di quell'alias in modo che esprima le chiamate sulla rotta giusta.

Il problema è request.url e request.path hanno lo stesso valore, ma la modifica request.path non funziona mentre request.url funziona. Inoltre non sono sicuro di quale testare nuovamente.

Le cose funzionano quando interagisco con request.url ma volevo solo assicurarmi che lo stia facendo nel modo giusto.

Qualche idea?

risposta

13

Riscrivere la proprietà req.url è il modo corretto per inoltrare le richieste internamente. Questo è il motivo per cui esiste uno req.originalUrl per i casi in cui si modifica l'URL originale.

Questo è ciò che i documentazione stati espressi per req.originalUrl:

Questa struttura è molto simile req.url, tuttavia conserva l'originale richiesta URL, che consente di riscrivere req.url liberamente per scopi di routing interni.

La proprietà req.url non è documentato, ma dalla dichiarazione di cui sopra si può dedurre che è pensato per essere utilizzato nel modo spiegato. Viene anche usato in questo modo in alcuni dei test Express.

+1

Questo non sembra funzionare dall'interno Express Mini router (usando 'express.Router()') –

0

È possibile utilizzare il modulo run-middleware esattamente per quello. Esegui semplicemente il gestore desiderato utilizzando il metodo & del metodo &.

https://www.npmjs.com/package/run-middleware

Ad esempio:

module.exports = function() { 

    return function(req, res, next) { 
    // getAlias would get an object {alias:"alias/path",source:"/real/path"} or null 
    var alias = getAlias(req.url); 
    if(alias) { 
     res.runMiddleware(alias,(status,data)=>(res.status(status).send(data)) 
    } 
    next(); 
    }; 

};