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中的多个可选路由参数?的主要内容,如果未能解决你的问题,请参考以下文章