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

Gle*_*leb 2 javascript node.js express

我使用角度2并表达js.所以对于所有不是css,images,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);
  });
Run Code Online (Sandbox Code Playgroud)

对于root router '/'它工作得很完美,但是如果我尝试打开另一个页面(例如'/ 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(Macintosh; Intel Mac) OS X 10_12_0)AppleWebKit/537.36(KHTML,与Gecko一样)Chrome/54.0.2840.71 Safari/537.36"

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

rob*_*lep 5

TL; DR:g从正则表达式中删除标志.

使用时/g,正则表达式保持内部状态(存储在lastIndex属性中)以便能够查找连续匹配.

在您的情况下,在请求之间维护此状态,因此对于第一个请求执行匹配,更新最后一个索引,并且当新请求进入时,匹配从最后一个索引开始.当它不匹配(并且可能不会)时,它重置的状态和新请求将再次匹配.