Express路由参数条件

71

我有一个Express应用程序的路由如下:

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

这个ID将始终是一个数字。 然而,目前这条路由正在匹配其他内容,比如/login

我认为我想从中获得两件事:

  1. 仅在ID为数字时使用此路由,以及
  2. 只有在没有为该特定参数定义路由时才使用(例如与/login的冲突)。

能做到吗?

3个回答

143

在 Marius 的回答基础上,你可以同时提供正则表达式和参数名称:

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

很好,但是如果我在其他地方有一个路由器,比如/1,它仍然会调用那个路由器。有什么方法可以防止这种情况发生吗? - user1082754
14
只要首先添加显式的“/1”路由,它就会优先生效。 - JohnnyHK
2
你可以像JohnnyHK建议的那样先放置显式路由。你也可以定义正则表达式来不匹配你想跳过的路由。 - danmactough
如果您使用类似Mongo ObjectID的字母数字ID,则需要更改正则表达式。 - Alexander Mills
这很聪明 :) - piyushkantm
显示剩余3条评论

12

4

您可以使用:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接