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

Posted

技术标签:

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

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

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

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

【问题讨论】:

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

以上是关于Express中的多个可选路由参数?的主要内容,如果未能解决你的问题,请参考以下文章

Express.js 路由:可选的 splat 参数?

Express.js 路由:可选的 splat 参数?

Node Express Mongoose:编写 API 以通过多个可选参数搜索数据

定义后无法将可选参数传递给express

express中的中间件

express.js - 单行中多个路由的单个路由处理程序