問題は、大きなシリアル化された JSON (16,000 文字を超える) をネット ソケット経由で送信するとチャンクに分割されることです。各チャンクはdata
、受信側でイベントを発生させます。JSON.parse()
そのため、受信データを単純に実行すると、 で失敗する場合がありSyntaxError: Unexpected end of input
ます。
これまでに思いついた回避策'\u0000'
は、シリアル化された JSON の末尾に null 文字 ( ) を追加し、受信側でそれを確認することです。次に例を示します。
var partialData = '';
client.on( 'data', function( data ) {
data = data.toString();
if ( data.charCodeAt( data.length - 1 ) !== 0 ) {
partialData += data;
// if data is incomplete then no need to proceed
return;
} else {
// append all but the null character to the existing partial data
partialData += data.substr( 0, data.length - 1 );
}
// pass parsed data to some function for processing
workWithData( JSON.parse( partialData ));
// reset partialData for next data transfer
partialData = '';
});
このモデルの失敗の 1 つは、レシーバーが複数のソケットに接続されていて、各ソケットが大きな JSON ファイルを送信している場合です。
これを行う理由は、同じボックスで実行されている 2 つのプロセス間でデータを渡す必要があり、ポートを使用したくないからです。したがって、ネットソケットを使用します。したがって、2 つの質問があります。まず、2 つの Node.js プロセス間で大きな JSON データをすばやく渡すためのより良い方法はありますか? 次に、これが最善の方法である場合、シリアル化された JSON が送信時にチャンクに分割される場合、どのようにすればより適切に処理できるでしょうか?