Regex для сопоставления маршрутов в Express

Я не очень хорошо разбираюсь в регулярных выражениях, поэтому хочу, чтобы я делал это правильно. Скажем, у меня есть два очень похожих маршрута, /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)

Ответ 1

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

Ответ 2

Вы должны использовать литерал javascript объект регулярного выражения, а не строку, а @sarnold правильно, что вы хотите, чтобы parens для чередования. Квадратные скобки предназначены для классов символов.

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 символа или этот маршрут не будет соответствовать. Используйте (.*), если вы хотите, чтобы он также соответствовал пусту.