Node.js中JSON错误,前缀为undefined的数据提交
我在往一个小的 node.js http 服务器发送 json 数据时遇到了问题。每次发送的数据前面总是会有一个 'undefined'。我可能做了什么傻事,真是抱歉!
我启动服务器,然后用下面的 Python 脚本发送一些 json 数据:
>>node simplehttp.js
>>python post.py '{"foo":"bar"}'
服务器收到的是这个
>>Request received: undefined{"foo": "bar"}
Invalid JSON:undefined{"foo": "bar"}
node 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);
用来发送数据的 Python 脚本
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()
1 个回答
3
你需要先给 content
定义一个初始值:
function onRequest(request, response) {
request.content = "";
在第一次调用 data
事件时,request.content
还不存在。这时候,如果你去查看一个未定义的属性,它的字符串表示就是 "undefined"
。
所以,为了说明 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.