12

node.jsを使用していて、リクエストのJSON本文を解析しようとしています。次のエラーが発生します。

undefined:0

^
SyntaxError: Unexpected end of input
    at Object.parse (native)
    at IncomingMessage.<anonymous> (C:\node\xxxx.js:36:14)
    at IncomingMessage.emit (events.js:64:17)
    at HTTPParser.parserOnMessageComplete [as onMessageComplete] (http.js:130:23)
    at Socket.ondata (http.js:1506:22)
    at TCP.onread (net.js:374:27)

私がやっている:

     request.on('data', function(chunk)
    {
    data+=chunk;
    });
     // and in the end I am doing
     obj = JSON.parse(data);  // it's complaining at this point.

入力は次のとおりです。

{
    "result": "success",
    "source": "chat"
}
4

4 に答える 4

30

データが完全に受信される前にデータを解析しようとしています...JSON.parseをリクエストの.endメソッド内に配置します

var data = '';
request.on('data', function(chunk){
  data += chunk;
});
request.on('end', function(){
  var obj = JSON.parse(data);
});
于 2012-11-03T20:02:47.940 に答える
3

編集後:コードのどこでJSON.parseを実行していますか?request.onは非同期であることを忘れないでください。JSON.parseデータが完了するまで呼び出すことはできません( request.on('end'))...次に呼び出すだけの場合は、データが到着する前に呼び出す可能性があります。

例えば

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

request.on('end', function() {
     obj = JSON.parse(data);
});

動作しますが

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

obj = JSON.parse(data);

JSON.parseは、'data'コールバックが発生する前に呼び出される可能性が高いため、そうではありません。

于 2012-11-03T20:23:52.540 に答える
1

「予期しない入力の終了」は、空の文字列または不完全なJSON文字列を解析しようとしたときに表示されるエラーメッセージです。

// examples
JSON.parse('')
JSON.parse('{')

したがって、データソースの信頼性が低いようです。これを処理する適切な方法は、JSON.parse()ステップが失敗した場合に、クライアントに400範囲の応答を返すことです。

于 2012-11-03T20:16:39.147 に答える
1
function connectionHandler(request, response) {
    var data = '';

    request.on('data', function(buffer) {
        data += buffer;
    });

    request.on('end', function() {
        response.writeHead(200, {
            'Content-Type': 'application/json'
        });

        try {
            data = JSON.parse(data.toString());
        } catch (e) {
            response.end();
            return;
        }

        if (!data) {
            return;
        }

        // process "data" here
    })
}
于 2015-10-16T18:37:36.900 に答える