在 Express 中有多个可选路由参数?

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

  • 如果三个参数都没有给出,则所有物品将被退回;
  • 给予年份的,退还当年的物品;
  • 如果给出了年份和月份,该年份和月份的物品将被退回;
  • 如果三个参数都给了,当年、月份和日期的物品将被退还。

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

84883 次浏览

编辑的目的是在一个答案中有3个不同的选项。

使用 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个路径,并重用相同的功能

使用 Query Params

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

快递指南路由提到:

Express 使用 path-to-regexp来匹配路由路径; 请参见 Path-to-regexp 文档中定义 快速路测试仪是一个测试基本路径的方便工具 高速公路,尽管它不支持模式匹配。

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

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

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

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