Express Node.js Framework: Как переписать URL, заменив один из именованных сегментов параметров? - PullRequest
1 голос
/ 29 августа 2011

В моем приложении Express я хотел бы выполнить некоторые перенаправления, когда определенные параметры маршрута соответствуют определенным критериям, используя предварительное условие параметра маршрута.В качестве примера, скажем, я хочу, чтобы параметр word был преобразован в верхний регистр, если это еще не сделано.

Параметр word может присутствовать в нескольких различных маршрутах, например /:word, /foo/:word, /foo/:word/bar и т. Д. К счастью, с предварительными условиями параметра маршрута все они обрабатываются одним и тем же кодом, например (код в CoffeeScript):

app.param 'word', (req, res, next, word) ->
  if word isnt word.toUpperCase()
    new_URL = // current URL, but replace word with word.toUpperCase() //
    res.redirect new_URL, 301

Мой вопрос касаетсякак построить new_URL, заменив :word его заглавным эквивалентом.Я хочу иметь возможность использовать одну и ту же функцию для построения new_URL, независимо от того, какой маршрут используется в настоящее время.

Я вижу, что есть req.route, но он не определен.Я предполагаю, что могу получить доступ к текущему подходящему маршруту через req.app.routes.routes.get[req._route_index], а затем разделить path и восстановить его, но это кажется слишком сложным.Есть ли способ просто перебрать сегменты path для текущего маршрута?Спасибо!

1 Ответ

1 голос
/ 01 сентября 2011

В итоге я написал небольшую функцию для замены именованного параметра маршрута новым значением. Я не уверен, что это оптимальное решение, и оно не является полным решением (оно определенно не будет работать с именованными параметрами сегмента nob, такими как /:from-:to).

replaceRouteParam = (req, param, replacement) ->
  segments = req.app.routes.routes.get[req._route_index].path.split('/')
  new_segments = []
  for segment in segments
    if segment is param
      new_segments.push replacement
    else if segment[0] is ':'
      new_segments.push req.params[segment[1..]]
    else
      new_segments.push segment

  new_segments.join '/'

Совет, который я получил по поводу использования этой функции в нескольких местах (мои ошибки, маршруты и т. Д., Которые находятся в разных файлах), заключался в том, чтобы поместить их в отдельный файл и использовать в тех файлах, в которых это необходимо.

...