/ / node.js et erreur d'exécution json - json, node.js

Erreur d'exécution node.js et json - json, node.js

J'utilise node.js et j'essaie d'analyser le corps JSON d'une requête. Je reçois l'erreur suivante:

undefined:0

^
SyntaxError: Unexpected end of input
at Object.parse (native)
at IncomingMessage.<anonymous> (C:nodexxxx.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)

Je fais:

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

l'entrée est:

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

Réponses:

29 pour la réponse № 1

Vous essayez d'analyser les données avant qu'elles ne soient complètement reçues ... placez votre JSON.parse dans la méthode de requête .end

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

3 pour la réponse № 2

Avec votre edit: où dans votre code faites-vous JSON.parse? Rappelez-vous que request.on est asynchrone; vous ne pouvez pas appeler JSON.parse jusqu'à ce que les données soient faites (request.on("end")) ... si vous l’appelez juste ensuite, vous l’appelerez probablement avant que les données ne soient arrivées.

Par exemple.

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

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

fonctionnerait, mais

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

obj = JSON.parse(data);

ne sera pas, car le JSON.parse sera probablement appelé avant tout "data" les rappels tirent.


1 pour la réponse № 3

"Fin inattendue de la saisie" est le message d'erreur résultant d'une tentative d'analyse d'une chaîne vide ou d'une chaîne JSON incomplète

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

Il semble donc que votre source de données ne soit pas fiable. La bonne façon de gérer cela est de retourner un Réponse à 400 gammes au client si / quand l'étape JSON.parse () échoue.


1 pour la réponse № 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
})
}