我正在使用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)?')
工作正常......
答案 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) {})