如何在express.js中使用命名参数定义复杂路由?

如何在express.js中使用命名参数定义复杂路由?,express,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 //

我想设置一些更复杂的路由,可以包括一些可选参数。为了便于访问,我最好使用命名参数。以下是我试图实现的一个示例:

// 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)?
。通过这种方式,我希望能够“混合并匹配”可选参数,同时仍然使用参数命名。不幸的是,这似乎不起作用

有没有什么方法可以让它工作,而不必编写直接的正则表达式并添加额外的逻辑来解析任何基于索引的参数组


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

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

/books?category=sports&author=jack&limit=15?sortby=title
这将使你能够做到

req.query.sortby

您可以让express使用正则表达式路径(如
(:key/:value)*
或类似于这些行的东西(将匹配多个键/值对)为您执行1/2的解析,但express不会为您进一步解析这些结果。

您可以按如下方式将数据发送到视图:

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

谢谢,这正是我所期望的,但我想确保我没有遗漏任何东西。支持更用户/搜索引擎优化友好的url格式,并具有与标准查询字符串相同的灵活性,这无疑是一个不错的特性。也许在将来的某个时候:)应该是
req.query.sortby
?@PeterLyons我肯定遗漏了什么,但是我在哪里可以找到可能的快速路线字符串的语法描述?即使像可选参数这样的基本内容也隐藏在express文档中,更复杂的情况就不用说了。当我发现可选参数时,我几乎求助于regexp匹配。。。谢谢。阅读代码。路由非正则表达式字符串是用于简单情况的方便方法,如“/user/:id”。如果不能使它们工作,只需使用表示所需语义的真正RegExp即可。这是行不通的,因为您在Express中添加了一个GET处理程序,但却从浏览器发送了一篇文章——这是一个相当小的错误。除此之外,它还得到了我的支持。无论出于何种原因,永远不要使用
eval
。。。你没看过好的部分吗?嗯。。不要相信你读到的一切。有很多时间可以使用eval,否则它将被弃用。但这绝对不是其中之一。如果您使用res.send而不是res.write,响应将作为JSON发送-您不需要在服务器上进行字符串化或在客户端进行解析。如果必须使用res.write,那么JSON.parse比eval更好。