Node.js表示静态服务器挂起图像 - 仅限Chrome

Jac*_*Guy 6 javascript google-chrome node.js express

这是一个非常奇怪的错误,一直困扰着我多年.我有一个使用Express Static中间件的基本网站,以及渲染Jade的单独路由.

这是我的配置

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'))
Run Code Online (Sandbox Code Playgroud)

这是我的问题.在Chrome中的单个标签中精确刷新5次后,图片文件就会拒绝加载.所有其他内容都很好,只是图片和Chrome浏览器.为了解决这个问题,您必须打开一个新选项卡.我已经在Firefox中对此进行了测试 - 没有问题.这个错误不仅发生在这个应用程序中 - 它也发生在我的许多其他应用程序中.

由于这个项目目前正在开发中,我宁愿不以在线为例.请放心,这完全可以重现.有任何想法吗?

更新:我更新了Express 4,因为更新可能会解决我的问题.它没.您可以在此处看到我对此问题进行的屏幕演示.

更新:为了测试问题是否与静态服务器有关,我将代码修改为:

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'))
Run Code Online (Sandbox Code Playgroud)

这没有任何影响,所以我认为这个问题无论是客户端还是Chrome的错误.

Jac*_*Guy 3

经过几个小时的调试,我发现这段遗留代码埋在我的服务器中。

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

它的目的是防止旧版本的 Express 对网站图标的双重请求。显然我忘记在最后调用 res.end() 。令我困惑的是,Firefox 和 Internet Explorer 都没有在刷新之间保持这种连接,而 Chrome 却做到了。我很欣赏大家的对话!