4

クライアント側は次のようになります。

var es = new EventSource("http://localhost:8080");
es.addEventListener("message", function(e) {
    alert("e.data") //Alerts "" every couple seconds
})
es.addEventListener("error", function(e) {
    alert("error") //Also fires every couple of seconds
})
var post_request = new XMLHttpRequest();
post_request.open("POST", "http://localhost:8080");
post_request.setRequestHeader("Content-Type", "text/plain");
post_request.addEventListener("readystatechange", function() {
    if (post_request.readyState == 4 && post_request.status == 200) {
        alert(post_request.responseText); //This works
    }
})
post_request.send("This is a test")

POST リクエストを処理するサーバー側 Node.js は次のようになります。

function process_request(request, response) {
    var request_body = []
    request.on("data", function(chunk) {
        request_body.push(chunk)
    }) 
    request.on("end", function() {
        request_body = Buffer.concat(request_body).toString()+"\n"
        response.writeHead(200, {"Access-Control-Allow-Origin": "*",
                                 "Content-Type": "text/event-stream",
                                 "Connection": "keep-alive"
                                });

        response.end("data: " + request_body + "\n"); 
    })
}

クライアント側から POST 要求データを送信するとresponse.end()、期待どおりに返されますが、数秒ごとのイベントesに加えて、数秒ごとにエラーが発生します。messageただし、messageイベントがトリガーされると、アラートが表示されますが、その""理由はわかりません。誰でもこの動作を理解するのを手伝ってもらえますか?

編集:とイベントをチェックしes.readyStateました。にあるので、切断された結果である可能性があります。この繰り返しの切断が発生するのはなぜですか? また、接続と切断を繰り返すと、イベントが繰り返されるのはなぜでしょうか?messageerrorreadyState0errormessage

4

1 に答える 1

2

何が起こっているかというと、ユーザーの SSE リクエストを処理し、データを送り返し、接続を閉じています。クライアントは接続が失われたことを認識し、数秒後に再接続します (この再接続は SSE の機能です)。

そのため、決して終了しないでください。request.on("end", ...つまり、決して到達しないようにする必要があります。

これは、以前に使用した node.js の基本的な SSE サーバーです。

var http = require("http");
var port = parseInt( process.argv[2] || 8080 );

http.createServer(function(request,response){
  console.log("Client connected:" + request.url);
  response.writeHead(200, { "Content-Type": "text/event-stream" });
  var timer = setInterval(function(){
    var content = "data:" + new Date().toISOString() + "\n\n";
    response.write(content);
    }, 1000);
  request.connection.on("close", function(){
    response.end();
    clearInterval(timer);
    console.log("Client closed connection. Aborting.");
    });
  }).listen(port);
console.log("Server running at http://localhost:" + port);

setIntervalつまり、実行を続けるためにa を使用します。リッスンする唯一のイベントは、接続を閉じるクライアントです。

于 2016-04-20T10:28:59.010 に答える