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

时间:2011-05-15 20:08:38

标签: 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);

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

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

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

2 个答案:

答案 0 :(得分:18)

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

/books?category=sports&author=jack&limit=15?sortby=title

这将使您能够

req.query.sortby

你可以使用像(:key/:value)*之类的正则表达式路径或者那些行中的某些东西(将匹配多个键/值对)来快速完成解析的1/2,但是表示isn然后再进一步解析那些结果。

答案 1 :(得分: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;
    }));
 });

并在客户端...调用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);
  }
});