В приложении перенаправление в 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();
  };

};