使用Express'路径路径匹配`/`和`/ index`

时间:2015-06-18 18:09:19

标签: javascript regex node.js express path

我正在使用Express,我希望将//index匹配到同一路线。但如果我写

app.route('/(index)?')

节点抛出此错误:

c:\myproject\node_modules\express\node_modules\path-to-regexp\index.js:69
  return new RegExp(path, flags);
         ^
SyntaxError: Invalid regular expression: /^\/(?(?:([^\/]+?)))?e\/?$/: Invalid group
    at new RegExp (native)
    at pathtoRegexp (c:\myproject\node_modules\express\node_modules\path-to-regexp\index.js:69:10)
    at new Layer (c:\myproject\node_modules\express\lib\router\layer.js:32:17)
    at Function.proto.route (c:\myproject\node_modules\express\lib\router\index.js:482:15)
    at EventEmitter.app.route (c:\myproject\node_modules\express\lib\application.js:252:23)
    at c:\myproject\server.js:28:19
    at Array.forEach (native)
    at Object.<anonymous> (c:\myproject\server.js:27:18)
    at Module._compile (module.js:460:26)
    at Object.Module._extensions..js (module.js:478:10)

请注意,如果我使用

app.route('/foo(bar)?')

工作正常......

2 个答案:

答案 0 :(得分:5)

问号用于可选路线参数,而不是可选路线段。例如:

app.route('/:myVar?');

使用app.route('/(index)?');,您将匹配字面为"http://myapp.com/(index)"的路由。

您需要正则表达式路径。

app.route(/^\/(index)?$/);
  • ^ - 匹配一行的开头,以便整个表达式必须从头开始匹配。

  • \/ - 是一个转义的正斜杠,所有表达路线处理程序通常都是以。

  • 开头。
  • (index)? - 现在按预期工作,因为它是正则表达式。由于问号,括号内容是可选的。

  • $ - 匹配一行的结尾,以便整个表达式必须一直匹配到最后。

如果省略^$,则正则表达式引擎会尝试将您的表达式与路由的子字符串进行匹配,这比检查整个url字符串是否匹配要贵一些,并且可能导致您没有预料到的路线匹配。感谢@robertkelp的建议。

答案 1 :(得分:-1)

路径路径可以是字符串,字符串模式或正则表达式

基于字符串

app.get('/about', function (req, res) {})

基于字符串模式

app.get('/ab?cd', function(req, res) {})

基于正则表达式

app.get(/.*fly$/, function(req, res) {})

http://expressjs.com/guide/routing.html