2017-10-02 10 views
0

Node.jsには、リクエストを処理するのに時間がかかるとします。したがって、リクエストを受け取り次第、サーバーは「私はあなたのリクエストを復活させました。私はあなたにすぐに戻ってきます」と返答したいと考えています。その後、要求が処理されると、サーバーは今回は実際の応答でクライアントに戻りたいと考えます。どうすればそれをすることができますか? 以下のコードスニペットでは、エラー(接続が閉じられたかどうかなど)が表示されます。同じリクエストに対して2つの応答を送信する

'use strict'; 
var http = require('http'); 
var numberOfRequests = 0; 
http.createServer(function (request, responce) { 
    request.n = numberOfRequests; 
    console.log('Request number ' + numberOfRequests + ' recioved!'); 
    responce.writeHead(200); 
    responce.write("soon we will get back to you for your request# " + request.n); 
    responce.end(); 
    setTimeout(function() { 
     responce.writeHead(200); 
     responce.write("Responce to your request# " + request.n); 
     console.log("Responce to the request# " + request.n); 
     responce.end(); 
    }, 5000); 

    numberOfRequests++; 
} 
).listen(8080); 
console.log('listening ...'); 
+1

あなたはできません。 HTTProtocolを使用してリクエストごとに1つのレスポンスしか得られないので、レスポンスが "まだ"ではない場合、*または*ダイレクトソケット接続をセットアップして、クライアントとサーバーがプッシュで通信できるようにする必要があります標準のHTTPではなく通知プロトコルを使用します。 –

+0

@ Mike'Pomax'Kamermansもう少し詳しく教えてください –

+0

「いいえ、HTTPでは複数の応答を送信できません.1つの要求は1つの応答を受け取ったときに処理されると見なされます」。それ以上のことをしたいのであれば、それで動作するRESTfulアーキテクチャを設計するか、Webソケットのような任意の通信を可能にする別のプロトコルを使用する必要があります。 –

答えて

4

同じリクエストに対して2つの応答を送信することはできません。リクエストごとに完全に形成されたレスポンスを1つだけ送ることができます。これがhttpの仕様です。私の知っているあなたの問題のため

唯一の回避策は以下のとおりです。フラッシュストリーミングモードで

  1. 使用します。http。ここでは、レスポンスの一部を送信し、そのレスポンスの一部を送信します。送信されたことを知っているので、部分応答を読み取って解釈する特殊なタイプのクライアントがあります(http応答が読み取られる通常の方法ではありません。ブラウザが独自に行うことではありません)。

  2. 最終的に実際のhttp応答を送信する前に、クライアントを進捗状況に更新するには、Webソケットまたはsocket.io接続を使用してください。ユーザーはsocket.io接続に接続し、長時間実行しているhttpリクエストを作成し、次にsocket.io接続で定期的な進捗状況を受け取り、完了したらhttp応答を受信します。これは、どんなウェブページでも簡単に行うことができます。解決しなければならない唯一の主な問題は、webSocket接続またはsocket.io接続と着信HTTP接続(通常セッションクッキー経由で行うことができます)を関連付けるメソッドをインストールする必要があるため、どのwebSocket接続またはsocket.io接続が関連付けられているかを知ることですちょうど到着したHTTP要求で。

  3. server-push schemeを使用して、2番目の応答をクライアントに「プッシュ」します。

  4. クライアントポーリングを実装します。クライアントにNN msでチェックインして応答があるかどうかを確認するように指示する最初のhttp応答を送信します。クライアントのチェックが再びNN msが後で、あなたは彼らのために最終的な応答を持っており、それを送信したり、あなたが探している

0

...再び対応NNミリ秒などで再度チェックするためにそれらを伝えるのいずれかときServer-Sent-Events(SSE)の場合はもちろん、チャンクされたデータを送信することもできますが、最後のデータが送信されるまでres.end()にコールしないでください。ところで、ヘッダーは1回だけ送信できます。この例を参照してください:

res.writeHead(200); 
res.write("The first piece of data"); 
setTimeout(()=>{ 
    res.write("This piece of data will be sent in 1 second."); 
    res.end("Ok, all data has be send, now close the connection."); 
}, 1000); 
関連する問題