Express路线中的可选GET参数

ale*_*ale 14 javascript node.js express

下列:

app.get('/foo/start/:start/end/:end', blah.someFunc);
Run Code Online (Sandbox Code Playgroud)

火柴

/foo/start/1/end/4
Run Code Online (Sandbox Code Playgroud)

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

/foo/start/1/end/4/optional/7
Run Code Online (Sandbox Code Playgroud)

我试过这个:

app.get('/foo/start/:start/end/:end(/optional/:value)?', blah.someFunc);
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Alb*_*gni 21

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

app.get('/foo/start/:start/end/:end/optional/:value', blah.someFunc);
app.get('/foo/start/:start/end/:end', blah.someFunc);
Run Code Online (Sandbox Code Playgroud)

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

如果你只想使用一行试试这个:

app.get('/foo/start/:start/end/:end/optional?', blah.someFunc)
Run Code Online (Sandbox Code Playgroud)

请参阅文档以获取示例.

  • 是的,我能做到,但我认为有一条规则会更清晰(如果可能的话):) (2认同)
  • 还有多少?你有一些我可以看到的数据吗? (2认同)

Aru*_*llu 18

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

app.get(['/service', '/service/id/:id'], function(req, res) {});
Run Code Online (Sandbox Code Playgroud)


hea*_*ick 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);
});
Run Code Online (Sandbox Code Playgroud)


Mat*_*rte 5

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

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

  • 为什么?Express将*all*route字符串转换为正则表达式.直接使用正则表达式可以在整个文档中找到:http://expressjs.com/4x/api.html#request (10认同)
  • 这看起来很脏dude :) (4认同)