1

我在这条路线上遇到了麻烦:

app.get('/project/:handle/browse/:filepath(.*)/children', files.children);                          //getting contents of any node in the directory structure

我希望路由解析包含:filepath参数的 url,该参数可以包含斜杠,然后是/children操作。这是我对参数(.*)设置正则表达式限制的失败尝试。:filepath

我想将这样的方案用于永久链接的目的,因此将一些路由参数移动到参数不是一种选择,并且 URI 编码会使它们变得丑陋......我环顾四周,但似乎 stackoverflow 上的所有答案都适合指向 URL 末尾带有斜杠的参数,例如:

app.get('/project/:path', files.children);

有任何想法吗?

谢谢!

4

2 回答 2

2

根据 gustavohenke 的评论,我决定使用正则表达式路由。这是工作代码!

    app.get(/project\/(([a-z]|[A-Z]|[0-9])+)\/browse\/(.+)\/children/,
        function(req,res)
        {
            req.params.handle = req.params[0];     //project handle
            req.params.filepath = req.params[2];   //relative path
            files.children(req, res);
        }
    );                          //getting contents of any node in the directory structure

诀窍是知道每当您使用(something)路由中的一个部分时,url 的每个“切片”都将在 req.params[] 数组中可用。使用内联回调函数并使用它将数组的每个元素复制到控制器操作中的人类可读参数......然后正常调用控制器方法。

至于正则表达式本身,我/通过编写\/和使用其中的(.+)语句来转义正则表达式中的(斜杠),这意味着“任何字符(.)至少一次(+)。如果你想要任何字符零次或多次,你会使用(.*)

感谢您为我指出正确的方法。

于 2013-09-30T16:02:22.090 回答
2

这个怎么样?

app.get('/project/:handle/browse/:filepath*/children', function(req, res) {
  var filepath = req.params.filepath + (req.params[0] || '');
   ...
});
于 2013-09-30T17:37:10.120 回答