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 № 1Vous 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
})
}