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