阻止favicon.ico发出第二个请求 - Node.js

时间:2013-10-07 12:45:00

标签: javascript node.js socket.io connect

我正在尝试阻止 favicon.ico 表单在套接字连接时发出第二个请求。

这是我的服务器:

var io = require('socket.io'),
connect = require('connect');

var app = connect()
.use(connect.static('public'))
.use(function(req, res, next){
    if (req.url === '/favicon.ico') {
        res.writeHead(200, {'Content-Type': 'image/x-icon'} );
        next();
    }
})
.use(function(req, res){
    res.end('stupid favicon...');   
}).listen(3000);

var game = io.listen(app);

game.sockets.on('connection', function(socket){
    socket.emit('entrance', {message: 'Welcome to the game!'});

    socket.on('disconnect', function(){
        game.sockets.emit('exit', {message: 'A player left the game...!'});
    });
    game.sockets.emit('entrance', {message: 'Another gamer is online!'});
});

这似乎不起作用。我没有错误,但是当一个套接字连接时,从客户端加载了两个图像,这使得看起来仍然有两个请求发生。

我的代码完全错了,还是我走在正确的轨道上?因为无论我在服务器代码中console.log()是什么,都不会向控制台打印任何内容。

编辑:客户端

var socket = io.connect('http://localhost:3000');

    socket.on('entrance', function(data){
        console.log(data.message);

        var num = (count > 0) ? count : '';
        console.log("hero" + num);

        var hero = new Car("hero" + num);
        hero.init();

        count++;
    });

count是全球性的。我有(现在有两张图片),一张#hero#hero1。当一个玩家连接时,两个图像都被加载。

1 个答案:

答案 0 :(得分:7)

当您想要回复请求时,您不应该致电next。通常,它对writeHead()无效,然后调用next。大多数中间件期望使用尚未写入网络的响应。

你的“愚蠢的图标”中间件运行的原因是你通过在第一个中调用next来调用它它。您需要res.writeHead()res.end() ,只需致电next

function(req, res, next){
    if (req.url === '/favicon.ico') {
        res.writeHead(200, {'Content-Type': 'image/x-icon'} );
        res.end(/* icon content here */);
    } else {
        next();
    }
}

或者,只需使用the builtin favicon middleware,这可以帮助设置正确的Cache-Control标题。