2015-03-13 4 views
2

Я пытаюсь переписать URL в Express JS 4. Все, что я читаю, говорит о том, что я должен перезаписать свойство request.url в промежуточном программном обеспечении. Два существующих модуля узла, которые переписывают, используют этот метод. Однако, когда я пытаюсь это сделать:Как переписывать URL в Express JS 4

app.use('/foo', function(req, res){ 
    var old_url = req.url; 
    req.url = '/bar'; 

    console.log('foo: ' + old_url + ' -> ' + req.url); 
}); 

app.get('/bar', function(req, res) { 
    console.log('bar: ' + req.url); 
}); 

это просто не работает.

Одно примечание, которое может помочь: оказалось, что req.url выше всегда / независимо от фактического используемого URL. Не удалось ли Express 4 изменить URL-адрес и не обновлять свою документацию? Как выполнить переписывание URL в Express 4?

ответ

6

Если вы хотите, чтобы обработка продолжалась после вашего изменения, вы должны позвонить next() в ваше промежуточное программное обеспечение, чтобы продолжить обработку других обработчиков.

app.use('/foo', function(req, res, next){ 
    var old_url = req.url; 
    req.url = '/bar'; 

    console.log('foo: ' + old_url + ' -> ' + req.url); 
    next(); 
}); 

doc for req.originalUrl говорит, что это:

Это свойство подобно req.url; однако он сохраняет исходный URL-адрес запроса , позволяя вам свободно переписывать req.url для внутренних целей маршрутизации . Например, «монтажная» функция app.use() перепишет req.url, чтобы удалить точку монтирования.

Это означает, что вы можете изменить req.url для изменения маршрутизации.


Связанные ответ: Rewrite url path using node.js

+1

Спасибо за помощь. Казалось, что есть две проблемы: одна, что я не вызывал next() и два, что я не понимал, что 'use ('/ foo', ...)' вытащит '/ foo' of request.url. –

+0

Вы также можете создать совершенно отдельный маршрутизатор и установить его. Например: 'controller.js':' var router = require ('express'). Маршрутизатор; router.get ('/ ur', handle) ;, router.post ('/ foo', handle); router.use ('/ bar', handle); ' Затем в' app.js': 'var ctrl = require ('./ controller'); app.use ('/ top-level-url', ctrl); ' – Zlatko

1

При использовании маршрутизаторов, лучшим решением является использование

req.url = '/new-url/'; 
app.handle(req, res, next); 

Подробнее об этом gist

Смежные вопросы