Express JS路由器有时会返回404,有时会返回200

我使用angular2和expressionjs。 所以对于不是CSS的所有请求,图像,js,video我发送index.html文件。 我的路由器代码:

router.get(/\/(?!((.*\.html$)|(.*\.css$)|(.*\.mp4)|(.*\.woff)|(.*\.js$)|(.*\.map$)|(.*\.jpg$)|(.*\.jpeg$)|(.*\.png$)|(.*\.gif$))).+$/gmi, ensureConnect.ensureLoggedIn({ redirectTo: '/' }), function(req, res) { res .set('Content-Type', 'text/html') .sendFile(../dist/index.html); }); 

对于根路由器'/'它是完美的,但如果我尝试打开另一个页面(例如'/ product / am-0596157134' )它有时会打开页面,但有时会返回404( 不能GET / product / am-0596157134

所以我试图重新加载页面两次,第一次重新加载它返回404和第二次 – 它返回200.这里是日志:

:: ffff:127.0.0.1 – – [10 / Nov / 2016:11:46:24 +0000]“GET / product / am-0596157134 HTTP / 1.1”404 34“ – ”“Mozilla / 5.0(Macintosh; Intel Mac OS X 10_12_0)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 54.0.2840.71 Safari / 537.36“

:: ffff:127.0.0.1 – – [10 / Nov / 2016:11:46:25 +0000]“GET / product / am-0596157134 HTTP / 1.1”200 2299“ – ”“Mozilla / 5.0 OS X 10_12_0)AppleWebKit / 537.36(KHTML,如Gecko)Chrome / 54.0.2840.71 Safari / 537.36“

任何想法,为什么发生,以及如何解决它?

TL; DR:从正则expression式中删除g标志。

当你使用/g ,正则expression式保持一个内部状态(存储在lastIndex属性中)能够find连续的匹配。

在你的情况下,这个状态是在请求之间维护的,所以对于第一个请求进行匹配,最后一个索引得到更新,当有新的请求进入时,匹配从最后一个索引开始。 当它不匹配(可能不会),它重置的状态和一个新的请求将再次匹配。