Express中的多个可选路由参数?

时间:2017-01-19 07:47:38

标签: node.js express routing

我使用Express来处理格式为/articles/:year/:month/:day的路线,其中年,月和日是可选的。

  • 如果没有给出三个参数,则所有文章都将被退回;
  • 如果给出年份,将返回当年的文章;
  • 如果给出年份和月份,则返回该年份和月份的文章;
  • 如果给出所有三个参数,将返回当年,月和日的文章。

我的问题是,如何让它们成为可选项?根据我已定义的当前路线,除非存在所有三个参数,否则它将无法解析并将落入默认路线。

3 个答案:

答案 0 :(得分:47)

路由提及的expressjs's guide

  

Express使用path-to-regexp来匹配路径路径;看到了   path-to-regexp文档,用于定义所有可能性   路线路径。 Express Route Tester是一个用于测试基本功能的便捷工具   快速路线,虽然它不支持模式匹配。

基本上,您可以使用 public class MyController : Controller { private readonly IOptions<IdentityOptions> _identityOptions; public MyContoller(IOptions<IdentityOptions> identityOptions) { _identityOptions=identityOptions?.Value ?? new IdentityOptions(); } public MyAction() { var length=_identityOptions.Value.Password.RequiredLength; } } 字符使参数可选。

?

答案 1 :(得分:20)

为了在一个答案中拥有3个不同选项的目的而编辑。感谢@ hjpotter92的正则表达式答案。

使用网址参数

使用正则表达式

app.get('/articles/:year?/:month?/:day?', function(req, res) {
  var year = req.params.year; //either a value or undefined
  var month = req.params.month;
  var day = req.params.day;
}

没有正则表达式

var getArticles = function(year, month, day) { ... }

app.get('/articles/:year', function(req, res) {
  getArticles(req.params.year);
}
app.get('/articles/:year/:month', function(req, res) {
  getArticles(req.params.year, req.params.month);
}
app.get('/articles/:year/:month/:day', function(req, res) {
  getArticles(req.params.year, req.params.month, req.params.day);
}

定义要支持的3个路径并重用相同的功能

使用查询参数

app.get('/articles', function(req, res) {
  var year = req.query.year; //either a value or undefined
  var month = req.query.month;
  var day = req.query.day;
}

此端点的网址如下所示:

http://localhost/articles?year=2016&month=1&day=19

答案 2 :(得分:0)

由于传递的参数中有下划线,因此这种类型的路线不太可能使用。

app.get('/products/:product_Id/buyers/:buyer_Id', function(req, res) {
  getArticles(req.params.product_Id, req.params.buyer_Id);
}

因此,如果路由不起作用,我建议您使用以下路由系统。在那里,您将能够发送多个参数。

app.get('/products/:productId/buyers/:buyerId', function(req, res) {
  getArticles(req.params.productId, req.params.buyerId);
}