14

以下:

app.get('/foo/start/:start/end/:end', blah.someFunc);

火柴

/foo/start/1/end/4

但我希望它也匹配一个可选参数

/foo/start/1/end/4/optional/7

我试过这个:

app.get('/foo/start/:start/end/:end(/optional/:value)?', blah.someFunc);

但它与上述两个示例中的任何一个都不匹配。我认为这是因为我试图RegExp在它期待别的东西时给它一个?

谢谢。

4

4 回答 4

22

你为什么不在你拥有的规则之前添加另一个规则,就像这样

app.get('/foo/start/:start/end/:end/optional/:value', blah.someFunc);
app.get('/foo/start/:start/end/:end', blah.someFunc);

它将在没有可选值的那个之前使用。

如果您只想使用一行,请尝试以下操作:

app.get('/foo/start/:start/end/:end/optional?', blah.someFunc)

有关示例,请参见文档。

于 2013-09-04T16:23:42.567 回答
19

如果您使用的是 Express 4.x,那么我认为最好使用数组格式进行路由。例如,我有一个路由/service,它给出了所有服务列表,当与 id 一起使用时,相同的路由/service/id/:id给出了参数中带有 id 的单个服务。

app.get(['/service', '/service/id/:id'], function(req, res) {});
于 2016-12-08T14:52:15.053 回答
6

在这个例子中,如果 url 是 /hello 或 /hello/world 它可以工作。这 ?使参数成为可选的(表达 4)。

// app.js
var index = require('/routes/index');
app.use('/hello', index);

// routes/index.js
router.get('hello/:name?', function(req, res){
  var name = req.params.name;
  var data = {
    name: name
  };
  res.json(data);
});
于 2017-02-25T23:16:36.833 回答
5

您还可以在路由中使用正则表达式。也许是这样的:

app.get(/^\/foo\/start\/:start\/end\/:end(\/optional\/:value)?/, function (req, res, next) {
于 2014-01-31T15:40:27.697 回答