【问题标题】:Multiple optional route parameters in Express?Express中的多个可选路由参数?
【发布时间】:2017-06-03 20:01:54
【问题描述】:

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

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

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

【问题讨论】:

  • 您可以为存在年份、年份和月份、所有参数都存在且不存在的情况定义多个路由,也可以将参数移动到查询字符串中
  • 您也可以通过在它们后面加上? 来使它们成为可选
  • @VsevolodGoloviznin 感谢您的建议。它们真的很有帮助,并且非常适合我的用例。我最终选择了 hjpotter92 的解决方案,因为它也很安静优雅并且导致代码更短。再次感谢您的帮助。
  • @hjpotter92 感谢您的建议!无法相信我在阅读指南时错过了如此重要的信息。我肯定会再次去 RTFM。你想正式把你的答案写在下面吗?如果可以,我会接受。
  • @hjpotter92 这就是我想要的。从 2021 年起非常感谢

标签: node.js express routing


【解决方案1】:

由于传递的参数中的下划线,这种类型的路由不太可能工作。

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

【讨论】:

  • 什么时候不能在变量中使用下划线?
【解决方案2】:

出于在一个答案中包含 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;
}

此端点的 url 如下所示:

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

【讨论】:

  • 非常感谢您的帮助。我认为他们完美地解决了我的用例(尤其是多路由提案),只是 hjpotter92 提出了一个更简单的解决方案。再次感谢您的帮助!
  • Open API 标准也建议使用查询参数作为可选参数。
【解决方案3】:

expressjs's guide 路由提及:

Express 使用path-to-regexp 匹配路由路径;见 path-to-regexp 文档,用于定义所有可能性 路线路径。 Express Route Tester 是一个方便的基础测试工具 Express 路由,虽然它不支持模式匹配。

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

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

【讨论】:

  • 好像不行。如果您使用路由测试器尝试该路由,/articles//1/2 例如不匹配。如果我只使用一个可选参数,它会起作用
  • @AndresEspinosa 你通过path-to-regexp了吗?您可以将* 用于任何嵌套路径
  • 是的,我做到了。我认为* 是一种不好的做法,因为它会匹配许多意想不到的路径。无论如何,您的意思是使用/articles/* 之类的东西,对吗?然后我必须自己解析路径的其余部分?
  • @AndresEspinosa 这取决于您期望的路径有多深。
猜你喜欢
  • 2015-02-25
  • 2020-04-20
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 2014-06-30
  • 2021-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多