Express路线中的可选GET参数

时间:2013-09-04 16:19:57

标签: javascript node.js express

以下内容:

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 个答案:

答案 0 :(得分:21)

为什么不在你拥有的规则之前添加另一条规则,比如

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)

请参阅the docs以获取示例。

答案 1 :(得分:17)

如果你使用Express 4.x那么我认为最好使用数组格式进行路由。 例如,我有路由/service,当使用id /service/id/:id时,它提供所有服务列表和相同的路由,在param中提供id为id的单个服务。

app.get(['/service', '/service/id/:id'], function(req, res) {});

答案 2 :(得分:7)

在这个例子中,如果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);
});

答案 3 :(得分:5)

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

app.get(/^\/foo\/start\/:start\/end\/:end(\/optional\/:value)?/, function (req, res, next) {