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

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

  • 如果三个参数都没有给出,所有的条款将被退回;
  • 如果给出年份,那么当年的文章将被退回;
  • 如果给出年月,则返回当年和月份的文章;
  • 如果所有三个参数都给出,那么这一年,那一天和那一天的文章将被返回。

我的问题是,我如何让他们可选? 用我定义的当前路线,除非所有三个参数都存在,否则它将不能被解决,并将落入默认路线。

expressjs的路由指南提到:

Express使用path-to-regexp来匹配路由path; 请参阅path-to-regexp文档以获取定义pathpath的所有可能性。 Express Route Tester是testing基本Express路由的便捷工具,但不支持模式匹配。

基本上可以使用? 字符使参数可选。

 /articles/:year?/:month?/:day? 

在一个答案中为了自己的目的而编辑3种不同的选项。 感谢@ hjpotter92他的正则expression式的答案。

使用URL参数

用正则expression式

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

没有正则expression式

 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个path并重用相同的function

与查询参数

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

这个端点的URL将如下所示:

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