2012-11-03 24 views
12

Ich verwende node.js und versuche, den JSON-Text einer Anfrage zu analysieren. Ich erhalte die folgende Fehlermeldung:node.js und JSON-Laufzeitfehler

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) 

ich tue:

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

Eingang:

{ 
    "result": "success", 
    "source": "chat" 
} 
+0

Können Sie klarstellen, was Sie mit "am Ende ich mache" meinen? Wie Joe sagte, muss dies im "fertig" -Ereignis geschehen, so dass es passiert, nachdem der Anfragetext vollständig zusammengestellt wurde, aber es ist nicht klar, ob Sie das tun. – greim

Antwort

29

Sie versuchen, die Daten zu analysieren, bevor sie vollständig empfangen ist. ..put Ihre JSON.parse innerhalb der .end-Methode der Anfrage

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

Danke für die Antwort. selbst diese Überprüfung di dnot Hilfe –

+0

ein Versuch/Catch würde es stoppen, eine Ausnahme zu werfen ... Ist das Objekt bereits geparst oder ist JSON.parse ein Problem mit der Zeichenfolge? –

+0

Es ist der JSON.parser hat ein Problem. Als ich die Frage eingefügt habe. Es ist ein gültiger Json-Körper mit jedem Element in "". –

1

„Unerwartetes Ende des Eingangs“ ist die Fehlermeldung Sie versuchen, eine leere Zeichenfolge oder unvollständigen JSON-String bekommen zu analysieren:

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

So klingt es wie Ihre Datenquelle ist unzuverlässig. Der richtige Weg, um dies zu umgehen, ist die Rückgabe eines 400-range response an den Client, wenn/wenn der JSON.parse() Schritt fehlschlägt.

+0

Danke für die Antwort: Ich sende eine Nachricht wie in der Frage gezeigt (ich habe sie jetzt bearbeitet) und habe dir gezeigt, wie ich versuche zu parsern ... sieht mir etwas anderes fehlt –

3

Mit Ihrer Änderung: wo in Ihrem Code tun Sie JSON.parse? Denken Sie daran, dass request.on async ist; Sie können JSON.parse nicht anrufen, bis die Daten fertig sind (request.on('end')) ... wenn Sie es nur als nächstes anrufen, dann rufen Sie es wahrscheinlich an, bevor die Daten angekommen sind.

z.

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

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

funktionieren würde, aber

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

obj = JSON.parse(data); 

nicht, weil die JSON.parse wird wahrscheinlich vor jeder 'data' Rückrufe Feuer aufgerufen.

+1

Es ist eigentlich das 'Ende'-Ereignis – greim

+0

was ist der Unterschied zwischen Ende Ereignis und Event gemacht? –

+0

gibt es nicht. :)) Ich habe einen Fehler gemacht, danke @greim – Joe

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 
    }) 
}