用于Express中路由匹配的正则表达式

Jon*_*Ong 65 regex node.js express

我对正则表达式不太满意,所以我想确保我正确地做到这一点.假设我有两条非常相似的路线,/discussion/:slug/并且/page/:slug/.我想创建一个匹配这两个页面的路由.

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

这是正确的方法吗?现在我只是创建了两条不同的路线.

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

Jon*_*Ong 108

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

  • 我认为关键是你可以通过在参数名称IE后面的"()"中将请求参数分配给正则表达式:`:type(<regex>)`将设置`req.params.type`匹配的字符串您不能将正则表达式放在变量之前. (6认同)
  • @rjmunro它记录在Express使用的`path-to-regexp`模块中.(这在Express文档中提到但是,是的,很容易忽略.)请参阅https://github.com/pillarjs/path-to-regexp (4认同)
  • 这种语法看起来很棒,但似乎根本没有在 https://expressjs.com/en/guide/routing.html 上记录:-( (2认同)

Pet*_*ons 61

您应该使用文字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);
Run Code Online (Sandbox Code Playgroud)

(.+)意味着必须存在至少1个字符的slu or或这条路线不匹配.使用(.*),如果你希望它匹配空蛞蝓,以及.

  • 你的正则表达式没有锚定在url的开头.表达明确是锚还是regexp应该是/\/(讨论| pa ... (5认同)
  • 你可以这样做`app.get(新的RegExp('(你的|字符串)\/here'),函数......` (3认同)