6

ソケットが接続されたときにfavicon.icoフォームが 2 番目のリクエストを作成するのを防ごうとしています。

ここに私のサーバーがあります:

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!'});
});

これはうまくいかないようです。エラーは発生しませんが、1 つのソケットが接続すると、クライアント側から 2 つのイメージが読み込まれるため、まだ 2 つのリクエストが発生しているように見えます。

私のコードは完全に間違っていますか、それとも正しい軌道に乗っていますか? サーバーコードに何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グローバルです。私は(今のところ2つの画像)、1#heroつと#hero1. 1 人のプレイヤーが接続すると、両方の画像が読み込まれます。

4

1 に答える 1

8

next要求に応答したいときに電話することは想定されていません。通常、 towriteHead()を呼び出してから呼び出すことはできません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();
    }
}

または、適切なヘッダーの設定などの重要なことを行う、組み込みの favicon ミドルウェアを使用するだけです。Cache-Control

于 2013-10-07T20:06:00.210 に答える