Node.JS奇怪行为接收发布数据

我正在发送XML请求数据到我的node.js服务器。 服务器被设置为接受post,并且已经通过CURL运行testing而没有问题。 现在我试图通过来自多个REST客户端的POST请求,并通过Chrome浏览器中的一个名为Postman的插件获取相同的数据。 最终目标是在EXE文件启动时接收数据到服务器。

我遇到的问题是,XML数据似乎进来,停在1439个字符(总字符接近3900)。 然后它会收到完整的3900个字符。 问题是XMLparsing器将这看作是一个糟糕的XML文档,因为前1439个字符正在消除语法。 我继续testing,但不明白为什么发送了1439个字符,然后跟随了3900个字符。

此外,这似乎并不总是发生。 我已经从这些来源连续多次testing,这种行为似乎只是随机发生。 我正在使用的完整代码如下所示。

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事件在data块进入时被多次触发,您需要等待所有data事件被等待parsing才能收到。

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