我正在尝试阻止 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
。当一个玩家连接时,两个图像都被加载。
答案 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
标题。