Node.js在图像上表示静态服务器挂起 – 仅Chrome

这是一个非常奇怪的bug,一直困扰着我很长一段时间。 我有一个基本的网站使用快速静态中间件,除了单独的路线,呈现翡翠。

这是我的configuration

app.set('views', __dirname + '/views'); app.set('view engine', 'jade'); app.use(stylus.middleware({ src : __dirname + '/public', dest : __dirname + '/public', compile : function(str, path) { return stylus(str) .set('filename', path) .set('compress', true) .use(nib()) } })); app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) app.use(cookieParser()) app.use(session({ secret: conf.sessionSecret, store: new RedisStore(), saveUninitialized: true, resave: true })); app.use(express.static(__dirname + '/public')) 

这是我的问题。 在Chrome中的单个标签中精确刷新5次后,图像文件将不会加载。 所有其他内容都很好,只是图像,只是在Chrome中。 为了解决这个问题,你必须打开一个新标签。 我已经在Firefox中testing过了,没有问题。 这个错误不仅发生在这个应用程序中,而且也发生在我的许多其他应用程序中。

由于这个项目目前正在开发中,我宁愿不把在线作为一个例子。 放心,这是完全可重复的。 有任何想法吗?

更新:我更新到Express 4的机会,更新可能会解决我的问题。 它没。 你可以在这里看到我所做的一个屏幕投影。

更新:为了testing问题是否与静态服务器,我修改我的代码是这样的:

 app.get('/img/*', function (req,res) { console.log(req.url); console.log(path.extname(req.url)); if (imgExt.indexOf(path.extname(req.url)) != -1) { res.sendfile('./public/'+req.url); } }); app.use(express.static(__dirname + '/public')) 

这没有效果,所以我认为这个问题是客户端或与Chrome的一个错误。

经过数小时的debugging,我发现了这些遗留在我的服务器中的代码。

 app.get('/favicon.ico', function (req, res) { res.writeHead(200, {'Content-Type': 'image/x-icon'} ); }); 

这是为了防止老版本的Express对双向图标的双重请求。 显然我忘了在最后调用res.end()。 我的想法令人浮想联翩的是,Firefox和IE浏览器都没有在刷新之间保持这种连接的活跃,而Chrome则是这样。 我很欣赏大家的对话!

我相信这是一个铬的bug,基于它只在铬(而不是火狐)。

要解决它,我会尝试:

  1. 试用Chrome Canary
  2. 降低超时时间:

    server.on('connection',function(socket){console.log(“一个新的连接是由一个客户端产生的)”; socket.setTimeout(30 * 1000);})

这也可以帮助:

我有一个混合的图像和html5video文件夹,我已经登上了服务。 这是所有的请求挂起作为服务静态蒸汽整个文件的video。

为了防止这个问题,我必须在安装该文件夹之前单独使用中间件来提供video。

希望这可以帮助别人