Подтвердить что ты не робот

Node.js и ошибка выполнения json

Я использую 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 complaining at this point.

:

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

Ответ 1

Вы пытаетесь проанализировать данные до того, как они будут полностью получены... поместите ваш JSON.parse внутри метода запроса .end

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

Ответ 2

С вашим редактированием: где в коде вы делаете 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'.

Ответ 3

"Неожиданный конец ввода" - это сообщение об ошибке, которое вы получите от попытки разобрать пустую строку или неполную строку JSON:

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

Итак, похоже, что ваш источник данных ненадежен. Правильный способ справиться с этим - вернуть клиенту 400-range response, если/когда шаг JSON.parse() завершился с ошибкой.

Ответ 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
    })
}