node.js和json运行时错误

时间:2012-11-03 20:00:30

标签: json node.js

我正在使用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 个答案:

答案 0 :(得分:29)

你试图在完全收到数据之前解析数据...把你的JSON.parse放在.end请求方法中

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

答案 1 :(得分:3)

使用您的编辑:您在代码中的哪个位置正在执行JSON.parse?请记住,request.on是异步的;在数据完成之前,您无法调用JSON.parserequest.on('end'))...如果您刚刚调用它,那么您可能会在数据到达之前调用它。

E.g。

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'回调之前被调用。

答案 2 :(得分:1)

“意外的输入结束”是您尝试解析空字符串或不完整的JSON字符串时会收到的错误消息:

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

所以听起来你的数据源不可靠。处理此问题的正确方法是,如果/当JSON.parse()步骤失败时,将400-range response返回给客户端。

答案 3 :(得分: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
    })
}