Подтвердить что ты не робот

Как разрешить слэши на моих курсах Express?

Я пытаюсь реализовать permalinks в форме /2013/02/16/title-with-hyphens. Я хотел бы использовать параметры маршрута. Если я попробую следующий маршрут:

app.get('/:href', function(req, res) { });

... тогда я получаю 404, по-видимому, потому, что Express ищет только один параметр и думает, что есть 4.

Я могу обойти это с помощью /:y/:m/:d/:t, но это заставляет мои постоянные ссылки иметь такую ​​форму навсегда.

Как мне получить параметры маршрута для включения косой черты?

4b9b3361

Ответ 1

Используйте регулярное выражение вместо строки.

app.get(/^\/(.+)/, function(req, res) {
    var href = req.params[0]; // regexp numbered capture group
});

Обратите внимание: вы не можете использовать синтаксис строки (app.get('/:href(.+)')), потому что Express разрешает только небольшое подмножество регулярных выражений в строках маршрута и использует эти регулярные выражения как условную проверку для этого конкретного компонента маршрута. Он не фиксирует согласованный контент в условном выражении и не позволяет вам сопоставлять компоненты (части URL, разделенные косой чертой).

Например:

app.get('/:compa([0-9])/:compb([a-z]/')

Этот маршрут соответствует только если первый компонент (compa) - это одна цифра, а второй компонент (compb) - это одна буква a-z.

'/:href(.+)' говорит, что "соответствует первому компоненту, только если контент - это что-то", что не имеет особого смысла; что поведение по умолчанию в любом случае. Кроме того, если вы исследуете источник, вы увидите, что Express фактически заставляет точку в этом условном быть литералом.

Например, app.get('/:href(.+)') фактически компилируется в:

 /^\/(?:(\.+))\/?$/i

Обратите внимание, что ваш . был экранирован, поэтому этот маршрут будет соответствовать только одному или нескольким периодам.

Ответ 2

Кажется, что app.get("/:href(*)", ...) работает нормально (по крайней мере, в Express 4). Вы получите значение вашего параметра в req.params.href.

Он также будет запущен маршрутом /, который, вероятно, не тот, который вы хотите. Вы можете избежать этого, установив app.get('/', ...) в другое место в вашем приложении или явно проверив пустую строку.

Ответ 3

Вы можете сделать это с помощью маршрутизации регулярных выражений

app.get('/:href(\d+\/\d+\/\d+\/*)', function(req, res) { });

Я не знаю, правильное ли регулярное выражение, но вы получаете идею

EDIT:

Я не думаю, что это работает, но это делает

app.get(/^\/(\d+)\/(\d+)\/(\d+)\/(.*)/, function(req, res) { });

Переход к http://localhost:3000/2012/08/05/hello-i-must-be yeilds req.params = [ '2012', '08', '05', 'hello-i-must-be' ]