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

新手上路,请多包涵

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

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

我的问题是,我如何使它们成为可选的?使用我定义的当前路由,除非所有三个参数都存在,否则将无法解析并会落入默认路由。

原文由 CLDev 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

expressjs 的路由指南 提到:

Express 使用 path-to-regexp 匹配路由路径;有关定义路由路径的所有可能性,请参阅 path-to-regexp 文档。 Express Route Tester 是一个用于测试基本 Express 路由的便捷工具,尽管它不支持模式匹配。

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

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

原文由 hjpotter92 发布,翻译遵循 CC BY-SA 3.0 许可协议

出于自己的目的进行编辑,以便在一个答案中包含 3 个不同的选项。感谢@hjpotter92 的正则表达式答案。

使用 URL 参数

使用正则表达式

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

此端点的 url 将如下所示:

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

原文由 R. Gulbrandsen 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏