/ / Erreur JSON dans le noeud js non défini comme préfixe pour publier des données - javascript, python, json, node.js

Erreur JSON dans le noeud js non défini en tant que préfixe pour publier des données - javascript, python, json, node.js

Je ne parviens pas à publier JSON sur un petit serveur http node.js. Les données de publication semblent toujours avoir un caractère "non défini". Je "suis probablement en train de faire une bêtise, alors mes excuses!

Je démarre le serveur et poste du json avec le script py ci-dessous:

>>node simplehttp.js
>>python post.py "{"foo":"bar"}"

Le serveur obtient ceci

>>Request received: undefined{"foo": "bar"}
Invalid JSON:undefined{"foo": "bar"}

noeud serveur http

var http = require("http"); // http-server

var server_http = http.createServer(
// Function to handle http:post requests, need two parts to it
// http://jnjnjn.com/113/node-js-for-noobs-grabbing-post-content/
function onRequest(request, response) {
request.setEncoding("utf8");

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

request.addListener("end", function() {
console.log("Request received: "+request.content);

response.writeHead(200, {"Content-Type": "text/plain"});
response.write("Thanks for sending a message");
response.end();

try {
json = JSON.parse(request.content);
if(json.m !== undefined){
console.log("m: "+json.m);
}

} catch (Error) {
console.log("Invalid JSON:" + request.content);
}
});
}
);

server_http.listen(9002);

script python à faire post

import sys
import json
import httplib, urllib, urllib2

# Get parameters
if len(sys.argv) < 2:
sys.stderr.write("Usage: python post.py [JSON Message]n")
sys.exit(1)

values = json.loads(sys.argv[1])
headers = {"Content-type": "application/json"}

conn = httplib.HTTPConnection("127.0.0.1", 9002)
headers = {"Content-type": "application/json"}
conn.request("POST", "", json.dumps(values), headers)
response = conn.getresponse()

print "response.status: "+response.status
print "response.reason: "+response.reason
print "response.read: "+response.read()
conn.close()

Réponses:

3 pour la réponse № 1

Vous devez définir la valeur initiale de content:

function onRequest(request, response) {
request.content = "";

Au premier appel au data un événement, request.content n'existe pas encore. La représentation sous forme de chaîne d'une propriété non définie est "undefined".

Donc, pour illustrer le mécanisme derrière request.content += chunk;:

request.content += chunk;                    // is equivalent to
request.content = request.content + chunk;   // but request.content is undefined
request.content = undefined       + chunk;   // String concatenation, so
request.content = "undefined"     + chunk;   // <-- This
// Example, chunk = "{}"  --> request.content = "undefined{}"

// After this step, `request.content` is defined, and future calls to
//  request.content += chunk;   are plain string concatenations.