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

Naï*_*ier 2 javascript regex path node.js express

我正在使用Express,我希望匹配//index使用相同的路线.但如果我写

app.route('/(index)?')
Run Code Online (Sandbox Code Playgroud)

节点抛出此错误:

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)
Run Code Online (Sandbox Code Playgroud)

请注意,如果我使用

app.route('/foo(bar)?')
Run Code Online (Sandbox Code Playgroud)

它工作正常......

Che*_*hev 5

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

app.route('/:myVar?');
Run Code Online (Sandbox Code Playgroud)

app.route('/(index)?');你匹配字面上的路线"http://myapp.com/(index)".

你想要一个正则表达式路线.

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

  • \/ - 是一个逃脱的正斜杠,所有快递路线处理人员通常都是从这个斜杠开始的.

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

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

如果省略^$再正则表达式引擎将尝试表达你对你的路线这是一个有点比检查如果整个URL字符串匹配更昂贵的子串匹配,并且它可能导致路由匹配你没有一定的期望.感谢@robertkelp的建议.