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 回答