快速路线参数条件


69

我的Express应用上有一条路线如下:

app.get('/:id', function (request, response) {
  …
});

该ID始终是数字。但是,此路线目前与其他条件匹配,例如/login

我想我希望从中得到两点:

  1. 仅在ID为数字时使用此路由,并且
  2. 仅当尚未为该特定参数定义路线时(例如与冲突/login)。

能做到吗?

Answers:


136

扩展Marius的答案,您可以提供正则表达式和参数名称:

app.get('/:id(\\d+)/', function (req, res){
  // req.params.id is now defined here for you
});

太好了,但是现在如果我有一条在/1其他地方说的路线,那还是可以称之为。无论如何要防止这种情况?

14
只要/1首先添加显式路由,它将具有优先权。
JohnnyHK

2
正如JohnnyHK所说,您可以先放置明确的路线。您还可以定义RegEx以使其与您要跳过的路线不匹配。
danmactough 2012年

按优先级顺序对路由处理程序进行排序,然后function(req, res, next)在逻辑知道需要将控制权传递给下一个路由处理程序时从任何路由中调用next()。
ekillaby

如果您使用像Mongo ObjectID这样的字母数字ID,则需要更改正则表达式
Alexander Mills


3

您可以使用:

// /12345
app.get(/\/([^\/]+)\/?/, function(req, res){
  var id = req.params[0];
  // do something
});

或这个:

// /post/12345
app.get(/\/post\/([^\/]+)\/?/, function(req, res){
  var id = req.params[0];
  // do something
});
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.