В приложении перенаправление в expressjs с использованием промежуточного программного обеспечения
Я пытаюсь создать промежуточное программное обеспечение для обработки псевдонимов URL-адресов, что я делаю прямо сейчас:
// [...]
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();
};
};
Итак, в основном я ищу в хранилище запрошенный url, и если он найден как псевдоним, я меняю request.url на исходный путь к этому псевдониму, чтобы экспресс вызывал правильный маршрут.
Проблема заключается в том, что request.url и request.path имеют одинаковое значение, но изменение request.path не работает, пока request.url работает. Кроме того, я не уверен, какой из них мне нужно проверить снова.
Вещи работают, когда я взаимодействую с request.url, но просто хочу убедиться, что я делаю это правильно.
Любые мысли?
Ответы
Ответ 1
Переписывание свойства req.url
является правильным способом для внутренних запросов перенаправления. Вот почему существует req.originalUrl
для случаев, когда вы меняете исходный URL.
Это то, что документация Express выражает для req.originalUrl
:
Это свойство очень похоже на req.url
, однако оно сохраняет оригинал request url, позволяя вам свободно переписывать req.url
для внутренних маршрутизации.
Свойство req.url
не документировано, но из вышесказанного вы можете сделать вывод, что оно предназначено для использования в том, как вы объяснили. Он также используется таким образом в некоторых экспресс-тестах.
Ответ 2
Вы можете использовать модуль run-middleware
для этого. Просто запустите обработчик, который вы хотите, используя URL, метод и данные.
https://www.npmjs.com/package/run-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) {
res.runMiddleware(alias,(status,data)=>(res.status(status).send(data))
}
next();
};
};