2013-10-07 35 views
4

我試圖阻止favicon.ico表單在套接字連接時發出第二個請求。防止favicon.ico發出第二個請求 - Node.js

這裏是我的服務器:

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(),都沒有打印到控制檯。

編輯:Client端

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

你可以顯示你的客戶端代碼,哪個圖像在那裏加載兩次? – user568109

+0

@ user568109完成 –

回答

8

當您要回復請求時,您不應該撥打next。通常,它不適用於writeHead(),然後致電next。大多數中間件希望能夠處理尚未寫入網絡的響應。

你的「愚蠢的favicon」中間件上運行的原因是你在第一個調用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頭。

+0

非常感謝。但是,我的代碼似乎仍然只有一個套接字連接後調用兩個圖像。我不知道這是否是favicon.ico的錯。你介意快點看看我以前的帖子嗎? http://stackoverflow.com/questions/19202615/two-images-is-loaded-instead-of-one-when-first-socket-connects-node-js –