我正在向node.js服务器发送post请求中的xml数据。服务器被设置为接受post,并且通过curl运行测试时没有问题。现在,我试图通过来自多个rest客户端的post请求和chrome中一个名为postman的插件来获取相同的数据。最终目标是在启动exe文件时向服务器接收数据。
我遇到的问题是,XML数据似乎进入并停止在1439个字符(总字符接近3900个)。然后接收完整的3900个字符。问题是XML解析器认为这是一个错误的XML文档,因为前1439个字符正在破坏语法。我继续测试,但不明白为什么发送1439个字符,然后接着是完整的3900个字符。
此外,这种情况似乎并不总是发生。我已经连续多次从这些来源进行测试,这种行为似乎只是随机发生的。下面列出了我正在使用的完整代码。
http.createServer(function (req, res) {
if(req.method=='POST'){
var body='';
req.on('data', function (data) {
body +=data;
body = body.toString();
var xmlDoc = libxmljs.parseXml(body));
var status = xmlDoc.get('//Status').text();
var ticket = xmlDoc.get('//Incident_ID').text();
console.log(status + " " + ticket);
});
req.on('end', function(){
});
}
else if(req.method=='GET'){
var url_parts = url.parse(req.url,true);
spectrum['alarm'] = url_parts.query.AlarmID;
spectrum['troubleshooter'] = url_parts.query.TroubleShooter;
spectrum['title'] = url_parts.query.AlarmTitle;
spectrum['date'] = url_parts.query.CreationDate;
spectrum['model'] = url_parts.query.ModelName;
spectrum['mac'] = url_parts.query.MAC;
spectrum['ip'] = url_parts.query.IP;
spectrum['severity'] = url_parts.query.Severity;
spectrum['knowledge'] = url_parts.query.KnowledgeID;
console.log("Contacted");
console.log("got varabiles");
eventEmitter.emit("gotVariables", spectrum);
}
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end("Request Submitted");
}).listen(1234, "localhost");
我完全搞不懂为什么会发生这种事,也不明白为什么会像现在这样随机发生。就目前的情况来看,这似乎只发生在长数据的情况下。当我发送一个简单的500个字符的xml文档时,它100%的时间运行良好。
我在使用curl时确实注意到有一个标题说expect:100 continue。我试图将此放入其他请求的头中,但没有成功。我可能没有正确使用它,或者node.js中可能没有处理某些内容,但我不确定。
希望这能给我提供足够的细节。我很感激你能帮我解决这个问题。
最佳答案
data
事件在数据块进入时被多次触发,您需要通过在end
事件中等待解析来等待它们全部被接收。
var chunks = [];
req.on('data', function (data) {
chunks.push(data);
});
req.on('end', function(){
var body = Buffer.concat(chunks).toString();
var xmlDoc = libxmljs.parseXml(body));
var status = xmlDoc.get('//Status').text();
var ticket = xmlDoc.get('//Incident_ID').text();
console.log(status + " " + ticket);
});