如何在express.js中定义带有命名参数的复杂路由?

JWK*_*JWK 14 express

我想设置一些更复杂的路由,其中​​可以包含许多可选参数.优选地,我想使用命名参数以便于访问.这是我想要实现的一个例子:

// The following routes should be matched based on parameters provided:
// GET /books/:category/:author
// GET /books/:category/:author/limit/:limit
// GET /books/:category/:author/skip/:skip
// GET /books/:category/:author/limit/:limit/skip/:skip
// GET /books/:category/:author/sort/:sortby
// GET /books/:category/:author/sort/:sortby/limit/:limit
// GET /books/:category/:author/sort/:sortby/skip/:skip
// GET /books/:category/:author/sort/:sortby/limit/:limit/skip/:skip
app.get('/books/:category/:author/(sort/:sortby)?/(limit/:limit)?/(skip/:skip)?', myController.index);
Run Code Online (Sandbox Code Playgroud)

如您所见,我正在尝试将可选参数分组(paramKey/paramValue)?.这样我希望能够"混合和匹配"可选参数,同时仍然使用参数命名.不幸的是,这似乎不起作用.

有没有办法让这个工作,而不必编写直接的正则表达式和添加额外的逻辑来解析任何结果的基于索引的参数组?

基本上,我正在寻找一种简单的方法来解析路由中的键/值对.

Pet*_*ons 18

看起来您想要使用URL路径重新实现查询字符串.我的猜测是,如果你真的想要它,是的,你必须编写自己的解析/解释逻辑.AFAIK表达路径参数是位置的,而查询字符串则不是.只需使用查询字符串,express将自动为您解析.

/books?category=sports&author=jack&limit=15?sortby=title
Run Code Online (Sandbox Code Playgroud)

这将使你能够做到

req.query.sortby
Run Code Online (Sandbox Code Playgroud)

您可以使用正则表达式路径(:key/:value)*或类似的东西(将匹配多个键/值对)来快速为您执行1/2解析,但express不会再进一步​​解析那些结果给你.


omo*_*ina 6

您可以发送数据进行查看,如下所示:

//in the server side ...
 app.get('/search/:qkey/:qvalue', function(req, res){
    res.write(JSON.stringify({
      qkey:req.params.qkey;
      qvalue:req.params.qvalue;
    }));
 });
Run Code Online (Sandbox Code Playgroud)

在客户端...呼叫ajax

$.ajax({
  type:"POST",
  url:"/search/"+qkey+"/"+qvalue,
  success: function(data){
    var string = eval("(" + data + ")");
    //you access to server response with
    console.log(string.qkey+" and "+ string.qvalue);
  }
});    
Run Code Online (Sandbox Code Playgroud)