2016-09-06 15 views
0

jsonオブジェクトをエンドポイントにストリーミングしているサーバーがあります。ここでは簡単な例です:httpエンドポイントからjsonチャンクのストリームをどのように消費できますか?

app.get('/getJsonObjects', function (req, res) { 
    res.write(JSON.stringify(json1)); 
    res.write(JSON.stringify(json2)); 
    res.write(JSON.stringify(json3)); 
    res.write(JSON.stringify(json4)); 
    res.write(JSON.stringify(json5)); 
    res.end(); 
}); 

ブラウザ要求を使用して、クライアント側では、私がやろうとしている:

var r = request(url); 
r.on('data', function(data) { 
    console.log(JSON.parse(data)); 
}); 

問題は、有効な文字列化JSONのエンドポイントチャンクへのストリーミングにもかかわらずです、要求から戻ってくるチャンクは、サーバーから送信されたJSONチャンクの開始/終了と必ずしも一致しないテキストチャンクです。つまり、JSON.parse(data)が失敗することがあります。

jsonのこれらのチャンクをエンドポイントに書き込まれたのと同じ方法でストリーミングする最良の方法は何ですか?

+0

http://oboejs.com – cartant

+0

ここでは、jsonオブジェクトにrequestを使用することをストリングしようとしているエンドポイントの例を示します。 http://augurnode1.eastus.cloudapp.azure.com:8547/getMarketsInfo?branchId=eq,1010101 –

答えて

0

これは非同期の問題です。あなたが提供したサーバーコードは、その順序でデータを送信することは保証されません。

チャンクをクライアント側に蓄積し、クライアント側でチャンクの順序を決定して表示するか、サーバー側で何らかのアキュムレータメソッドを実行してからJSONを出力する必要があります彼らは処理されるように注文します。

編集: res.writeは、「chunked」というエンコードタイプを使用できるようです。ですから、ヘッダーフィールドをチャンクに設定して、res.write()のエンコーディングパラメータに "chunked"を指定してみてください。これが失敗した場合 https://nodejs.org/api/http.html#http_response_write_chunk_encoding_callback

、あなただけのres.writeの順序を保証するためにres.writeのコールバックパラメータを使用して巨大なコールバック/約束のチェーンを作ることができます()。

+0

私は "チャンク"を試してみます。また、明確にするために、私は実際に私の書き込み順序が私の読み込み順序と同じであることに気をつけません。クライアント上でストリーミングするときに、結果を有効なjsonとして解析できるだけです。 –

+0

その場合、チャンクエンコーディングを使用するか、クライアント側で注文を決定する必要があります。 –

+0

残念ながら私はこれがうまくいくとは思わない。書き込み前にサーバーコードに 'res.setHeader( 'Transfer-Encoding'、 'chunked');を設定しましたが、クライアント上のストリームに返されたデータを解析しようとしても同じことが起こります。 –

関連する問題