3

JSON.parse()Node.js で、チャンク入力を文字列に追加して後で実行するよりも、JSON データを受け入れるためのより良い方法はありますか? サーバーは、JSON 入力が有効であると想定することはできず、JSON.parse()JSON データを検証するために私が知っている唯一の方法です。

次のサーバーが受け入れると仮定します。

  • POST リクエストのみ
  • JSON データのみ
  • Content-Typeのヘッダーのみ"application/json"

.

var server = http.createServer(function(req, res) {
    ....

    var parsedData;
    var inputData = '';

    req.on('data', function(chunk) {
        inputData += chunk;
    });

    req.on('end', function() {
        parsedData = JSON.parse(inputData);
    }

    ....
}

入力データを厳密に強制している場合、このデータを単純に文字列に追加してからJSON.parse()、本質的に (適切な JSON が入力されていると仮定して) JSON -> string -> JSON. (もちろん、データが有効であると仮定することはできません。)

4

1 に答える 1

2

あなたのしていることは、本当にいいことです。ただし、毎回新しい文字列を作成するのではなく、各チャンクを配列に追加してから配列に結合するだけでパフォーマンスを調整できる場合があります。

例えば

var inputData = [];
var parsedData;

req.on('data', function(chunk{
    inputData.push(chunk); //assuming chunk is from utf-8 stream, if not call chunk.toString()
});

req.on('end', function(){
    try {
       parsedData = JSON.parse(inputData.join(''));
    } catch (err) {
      //handle error    
    }
});

このようにして、毎回新しい文字列を再割り当てして作成する必要はありませんinputData += chunk。V8はこのケースを非常にうまく最適化するため、これは予想される小さな入力に対しては問題ありません。

さて、悪いJSONのメモについて。あなたが見たいと思うかもしれないオプションがあります。

  1. JSONStream - これが解析エラーをどのように処理するかはよくわかりませんが、大きな JSON 入力には非常に適しています。

  2. json-scrape - これは、JSON ではない不適切な入力を除外するのに非常に適しています。

うまくいけば、この情報はいくつかの助けになります。

于 2012-10-15T05:05:32.440 に答える