Regex for route matching in Express

Regexnode.jsExpress

Regex Problem Overview


I'm not very good with regular expressions, so I want to make sure I'm doing this correctly. Let's say I have two very similar routes, /discussion/:slug/ and /page/:slug/. I want to create a route that matches both these pages.

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

Is this the correct way to do it? Right now I'm just creating two separate routes.

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

Regex Solutions


Solution 1 - Regex

app.get('/:type(discussion|page)/:id', ...) works

Solution 2 - Regex

You should use a literal javascript regular expression object, not a string, and @sarnold is correct that you want parens for alternation. Square brackets are for character classes.

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);

The (.+) means a slug of at least 1 character must be present or this route will not match. Use (.*) if you want it to match an empty slug as well.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJonathan OngView Question on Stackoverflow
Solution 1 - RegexJonathan OngView Answer on Stackoverflow
Solution 2 - RegexPeter LyonsView Answer on Stackoverflow