所以我正在向本地运行的node.js HTTP服务器发送HTTP POST请求。我希望从HTTP主体中提取JSON对象,并使用它所拥有的数据在服务器端执行某些操作。
这是我的客户端应用程序,它发出请求:
var requester = require('request');
requester.post(
'http://localhost:1337/',
{body:JSON.stringify({"someElement":"someValue"})},
function(error, response, body){
if(!error)
{
console.log(body);
}
else
{
console.log(error+response+body);
console.log(body);
}
}
);
这是应该接收该请求的服务器:
http.createServer(function (req, res) {
var chunk = {};
req.on('data', function (chunk) {
chunk = JSON.parse(chunk);
});
if(chunk.someElement)
{
console.log(chunk);
// do some stuff
}
else
{
// report error
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Done with work \n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');
现在问题是,因为具有回调的req.on()
函数异步提取POST数据,所以在完成之前似乎评估了if(chunk.someElement)
子句,因此它总是转到else条款,我根本无法做任何事情。
req.on()
和if(chunk.someElement)
相同的任务
在我做之前返回身体的内容
{{1}}检查?答案 0 :(得分:4)
您需要等待并缓冲请求,并在请求结束时解析/使用JSON'结束'而是因为无法保证所有数据都将作为单个块接收:
http.createServer(function (req, res) {
var buffer = '';
req.on('data', function (chunk) {
buffer += chunk;
}).on('end', function() {
var result;
try {
result = JSON.parse(buffer);
} catch (ex) {
res.writeHead(400);
return res.end('Bad JSON');
}
if (result && result.someElement)
{
console.log(chunk);
// do some stuff
}
else
{
// report error
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Done with work \n');
}).setEncoding('utf8');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');