Регулярний вираз для відповідності маршрутів у Express


75

Я не дуже добре володію регулярними виразами, тому хочу переконатися, що я роблю це правильно. Скажімо, у мене є два дуже схожі маршрути, /discussion/:slug/і /page/:slug/. Я хочу створити маршрут, який відповідає обом цим сторінкам.

app.get('/[discussion|page]/:slug', function(req, res, next) {
  ...enter code here...
})

Це правильний спосіб зробити це? Зараз я просто створюю два окремі маршрути.

someFunction = function(req, res, next) {..}
app.get('/discussion/:slug', someFunction)
app.get('/page/:slug', someFunction)

4
Ви впевнені в []дужках для чергування? Тоді я вперше бачу, як їх використовують таким чином. (Парени ()частіше зустрічаються в інших інструментах - я просто не знаю вашого конкретного інструменту.)
sarnold

1
ой, помилка. але я намагаюся знайти приклади для експрес, і я не можу знайти жодного (або я не знаю термінів для пошуку).
Джонатан Онг

просто зробіть 'someFunction' такою ж точною функцією, це простіше зробити, можливо, ви вже це зробили
Олександр Міллс

У такому випадку app.get (['/ обговорення /: куля', / сторінка /: куля '], функція (req, res, next) {... введіть код тут ...}) також є опцією.
Макс

Відповіді:


119

app.get('/:type(discussion|page)/:id', ...) робіт


7
Я думаю, що ключовим моментом цього є те, що ви можете призначити параметр запиту регулярному виразу, помістивши його в "()" після назви параметра IE: :type(<regex>)буде встановлено req.params.typeвідповідний рядок. Ви не можете ставити регулярний вираз перед змінною.
подвійність

2
Цей синтаксис виглядає чудово, але, схоже, взагалі не задокументований за адресою expressjs.com/en/guide/routing.html :-(
rjmunro

7
@rjmunro Це задокументовано в path-to-regexpмодулі, який використовує Express. (Це згадується в документах Express, але, так, це просто не помітити.) Дивіться github.com/pillarjs/path-to-regexp
broofa

Дякую, це працює для мене. Однак це, здається, case sensitiveвстановлено falseза замовчуванням. Чи можу я встановити його на true? Здається, це офіційний шлях до документів - регулярний вираз
bcjohn

67

Ви повинні використовувати буквальний об'єкт регулярного виразу javascript, а не рядок, і @sarnold правильно, щоб ви хотіли парені для чергування. Квадратні дужки призначені для класів символів.

const express = require("express");
const app = express.createServer();
app.get(/^\/(discussion|page)\/(.+)/, function (req, res, next) {
  res.write(req.params[0]); //This has "discussion" or "page"
  res.write(req.params[1]); //This has the slug
  res.end();
});

app.listen(9060);

В (.+)означає слимак , по крайней мере , 1 символ повинен бути присутнім або цей маршрут не співпадатиме. Використовуйте, (.*)якщо ви хочете, щоб він також відповідав порожньому кулі.


Чи є спосіб використовувати це без регулярного виразу та як рядка? Я віддаю перевагу параметрам ключових слів замість списку.
Джонатан Онг

1
AFAIK не має можливості використовувати рядок із названими параметрами, якщо вам потрібні складні можливості збігу регулярних виразів. TJ щось про це говорить у експрес-документації. Я вважаю, що це, зрештою, обмеження об'єктів регулярного виразу javascript.
Пітер Лайонс

3
ви можете це зробитиapp.get(new RegExp('(your|string)\/here'), function…
Міша Рейзлін

5
Ваш регулярний вираз не закріплений на початку URL-адреси. Виражає явно прив'язку або регулярний вираз повинен бути / \ / (обговорення | pa ...
user239558

1
Це має бути так, /^\/(discussion|page)\/(.+)/як запропонував користувач вище. Я запропонував редагувати.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.