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

时间:2016-11-10 12:37:13

标签: 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);
  });

对于根路由器' /' 它运作完美,但如果我尝试打开另一个页面(例如' / product / am-0596157134&#39 ; )它有时会打开页面,但有时会返回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"

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

1 个答案:

答案 0 :(得分:5)

TL; DR:从正则表达式中删除g标记。

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

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