【问题标题】:node.js and json runtime errornode.js 和 json 运行时错误
【发布时间】:2012-10-24 03:48:03
【问题描述】:

我正在使用 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"
}

【问题讨论】:

  • 你能澄清一下“我到底在做什么”是什么意思吗?正如乔所说,这需要在“完成”事件中完成,以便在请求正文完全组装后发生,但您的 OP 不清楚您是否正在这样做。

标签: json node.js


【解决方案1】:

您正在尝试在数据完全接收之前对其进行解析...将您的 JSON.parse 放入请求的 .end 方法中

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

【讨论】:

  • 感谢您的回复。即使那张检查也没有帮助
  • try/catch 会阻止它抛出异常...是对象已经解析还是 JSON.parse 的字符串有问题?
  • 它的 JSON.parser 有问题。正如我在问题中粘贴的那样。它是一个有效的 Json 主体,每个元素都在 "" 中。
  • 您粘贴的是对象如何输出...有效的 JSON 是字符串 '{"result": "success", "source": "chat"}'
  • 我建议在 catch 块中记录/输出不良数据,以便您了解发生了什么。正如目前所写的那样,您会默默地吞下错误,这通常会在以后导致麻烦。
【解决方案2】:

“Unexpected end of input”是您尝试解析空字符串或不完整的 JSON 字符串时得到的错误消息:

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

所以听起来您的数据源不可靠。处理此问题的正确方法是在 JSON.parse() 步骤失败时向客户端返回 400-range response

【讨论】:

  • 感谢您的回复。我正在发送问题中所示的消息(我现在编辑)并向您展示了我如何尝试解析。看起来我还缺少其他东西
【解决方案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' 回调触发之前被调用。

【讨论】:

  • 实际上是“结束”事件。
【解决方案4】:
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
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2018-03-08
    • 2014-06-14
    • 1970-01-01
    相关资源
    最近更新 更多