2017-12-06 1 views
0

非常に単純なnodejs socket.ioアプリケーションを作成しています。どういうわけか、これは "送信後にヘッダーを設定できません"というエラーを返します。ヘッダーが再び設定されている箇所はわかりません。私はserver.listenを一度しか呼び出していないので、socket.listenは独立して動作するので、競合しないはずです。送信後にヘッダーを設定できませんsocket.ioでエラーが発生しました

私は、ヘッダーエラーが複数回転記されたことを設定できないことを認識しています。私はそれらを簡単に読んで、私はresponse.writeHeadが正常な状況下でどのように動作するのか理解しています(私はresponse.writeHeadでいくつかのnode.jsアプリケーションを実験しました。それはsocket.ioによるのですか?

const fs = require("fs"); 

const server = require("http").createServer(); 
const io = require("socket.io").listen(server); 

server.listen(52273,function(){ 
    console.log("server up"); 
}); 

server.on("request",function(request,response){ 
    fs.readFile("mainpage.html",function(error,data){ 
    response.writeHead(200,{"Content-Type":"text/html"}); 
    response.end(data); 
    }); 
}); 

io.sockets.on("connection",function(socket){ 

    var roomName = null; 
    socket.on("join", function(data){ 
    roomName = data; 
    socket.join(data); 
    console.log("client joined" + data); 
    }); 

    socket.on("message",function(data){ 
    io.sockets.in(roomName).emit("message","test"); 
    }); 
}); 

答えて

0

使用しているノードのバージョンは?

0.9.xを使用していたときも同じ問題がありました。 Nodeを0.8.4にダウングレードしたところ、問題はなくなってしまったようです。

私の最高の推測は、Socket.ioが同意しなかったNodeの変更点です。

+0

ご意見ありがとうございました。私はノードをダウングレードしようとします –

1

ここでは、socket.ioがWebサーバーとどのように機能するかを少し理解するのに役立つでしょう。 socket.ioはwebSocketプロトコルを基本プロトコルとして使用します。 webSocket接続は、WebSocket接続の開始を示す特別なヘッダーが設定されたHTTP要求で始まります。正常に機能しているWebサーバーでは、このwebSocketヘッダーが表示され、WebSocket接続を開始するために要求をwebSocketハンドラーに渡します。

しかし、あなたが持っているこのハンドラ:それが到着すると関係なく、要求が何であったか、応答を送信していないすべての単一の要求に応答しているよう

server.on("request",function(request,response){ 
    fs.readFile("mainpage.html",function(error,data){ 
    response.writeHead(200,{"Content-Type":"text/html"}); 
    response.end(data); 
    }); 
}); 

が見えます。したがって、WebSocketリクエストが来たら、webSocketサーバーコードから1つ、そして上記のハンドラからrequestの2つの応答を送信していると思います。

おそらく、あなたのwebSocketリクエストではない特定のURLに対してのみあなたのmainpage.htmlレスポンスを送信できる必要があります。

、中に何が起こっているのかについて、もう少しを参照してくださいここにconsole.log()を挿入するには:

server.on("request",function(request,response){ 
    console.log(request.url); 
    fs.readFile("mainpage.html",function(error,data){ 
    response.writeHead(200,{"Content-Type":"text/html"}); 
    response.end(data); 
    }); 
}); 

そして、あなたはおそらく、あなたが望むものではないのWebSocket要求にあなたのmainpage.htmlを送信して表示されますする。リクエストハンドラがwebSocketリクエストを回避できるように、ifロジックを追加することをお勧めします。

+0

詳細な対応をありがとうございます。最後にfs.readfile()メソッドの閉じ括弧(})にエラーが見つかりました。ページは最初は正常にロードされます(つまり、webSocket要求後に正常に動作していることを意味します)。私はnode.jsとsocket.ioの異なるバージョンを使用してみるべきだと思います。私は結果と一緒に戻ってきます。 –

+0

@SungryeolPark - はい、それは問題が私が記述したようなものであればエラーになります。あなたのwebSocketハンドラは、まだ着信webSocket接続の応答を送信しましたが、汎用要求ハンドラは別の応答を送信しようとしていますが、これは許可されていません。異なったバージョンのsocket.ioを使っていこうとすることはここでは問題になりません。コードが壊れています。特定のURLが要求されたときにのみ 'mainpage.html'を送る必要があります。なぜなら、webSocketリクエストが来て間違っていても' mainpage.html'を送信しようとしているからです。 – jfriend00

+0

@SungryeolPark - リクエストハンドラに 'console.log(request.url)'を入れ、webSocketが接続するときにどのURLがそこに表示されているのかを特定し、webSocket URLのときにレスポンスを送信しないように 'if'文を追加します。 – jfriend00

0

ありがとうございました。私は実験アプリにexpressをインストールすることで問題を解決しました。マニュアルをもう一度読んで、socket.io v2が依存関係として急行アプリを必要としていることを発見しました。私はsocket.io v2を使用していたようですが、何とかsocket.io v1スタイルのアプリを書くことに固執していました。それをsocket.io v1にダウングレードしたときにも動作しました。

TL; DR - socket.io v2はsocket.io v1用に作成されたアプリケーションと互換性がありません。 socket.io appが "送信後にヘッダーを設定できません"というエラーを返した場合は、適切なバージョンのsocket.ioを使用するか、正しい依存関係をインストールしてみてください。

関連する問題