如何使用path-to-regexp来匹配所有不以/ api /开头的路径?

时间:2016-08-24 12:40:06

标签: javascript regex node.js routes

使用path-to-regexp时,如何匹配所有不以/api/开头的路径?

使用原生JavaScript RegExp /^(?!\/api\/).*/将匹配/x/y/z。查看来自here的测试结果 enter image description here

但是,它不适用于path-to-regexp。查看there

的测试结果

enter image description here

那么在路径到正则表达式中实现目标的正确方法是什么?

[更新1]

更多细节: 真实的情况是我正在使用angular2 + koajs。在angular2中,浏览器可以向服务器发出客户端路由URL。有关此问题,请参阅我的another question

要解决该问题,正如@mxii所建议的那样,我正在尝试使用koa-repath将所有未以/api/开头的请求重定向到根网址:http://localhost:3000/,除非它是静态资产(js / json / html / png / ...)请求。

koa-repath使用path-to-regexp来匹配路径。这就是我问这个问题的原因。

3 个答案:

答案 0 :(得分:3)

请参阅我的评论,了解快速路线测试仪的工作原理。

如果您只想要一个简单的正则表达式来检查字符串是不是以api还是/api开头,那么您不需要“路径到正则表达式”,您可以简单地使用这个正则表达式:

/^(?!\/?api).+$/

说明:

^    => beginning of string
(?!) => negative look-ahead
\/?  => 0 or 1 slash
.+   => 1 or more character (any except newline)
$    => end of string

如果字符串的开头没有跟/api(可选的斜杠),那么你得到一个匹配。

有关示例,请参阅http://regexr.com/3e3a6

修改:如果您想要反过来(仅匹配以/apiapi开头的网址,您可以使用正面预测:

^(?=\/?api).+$

http://regexr.com/3e3a9

但它更简单:

^\/?api.*$

http://regexr.com/3e3af

答案 1 :(得分:0)

模式打击[/ somestring] +,

需要正则表达式

例如,

  1. / api-有效
  2. / asdsa-有效
  3. /-无效
  4. asdsa-无效
  5. / asd / asd / asd-有效
  6. / as /-无效
  7. / aas / a-有效

答案 2 :(得分:0)

我试图做同样的事情。似乎回答的人实际上并没有试图理解您的要求。

我不确定是否可以在正则表达式路径中使用。似乎没有负面的展望。

您可以做的是更改路由路径的顺序。在添加静态内容之前,添加您的api路由来表达/。

app.use('/api', require('./api'));

app.get('/*', function (req, res) {
  //serve angular app  
});

我是这样做的,并且api路由也可以工作。