2

我在 post 请求中将 XML 数据发送到我的 node.js 服务器。服务器设置为接受帖子,并且通过 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 中可能没有处理某些东西,但我不确定。

希望这为我正在尝试做的事情提供了足够的细节。我感谢任何帮助解决此问题。

4

1 回答 1

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);
});
于 2013-04-24T03:52:47.167 回答