Node.JS接收后期数据的奇怪行为

时间:2013-04-24 00:34:49

标签: xml node.js http rest post

我将post数据中的XML数据发送到node.js服务器。服务器设置为接受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中处理,但我不确定。

希望这能为我正在尝试的内容提供足够的细节。我很感激您在解决此问题时提供的任

1 个答案:

答案 0 :(得分:2)

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);
});