【问题标题】:Node.JS Odd Behavior Receiving Post DataNode.JS 接收帖子数据的奇怪行为
【发布时间】:2013-04-24 11:52:47
【问题描述】:

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

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

【问题讨论】:

    标签: xml node.js http rest post


    【解决方案1】:

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

    【讨论】:

    • 这非常有效。感谢您发布此内容,我非常感谢。我很难找到这方面的任何数据,所以不确定解析应该去哪里,但这完全有道理。只是为了确保我了解正在发生的事情,您设置了一个数组并将数据推送到该数组,因为它在第一个函数中出现。然后所有数据都被移动到第二个函数,基本上只是抓住那些块将它们放在一起并推送到字符串?我不明白的唯一部分是缓冲区在做什么。将不得不对此进行一些研究。再次感谢!
    • @ThomDuran 正确!每个data 对象是一个节点Buffer,而不是一个字符串,所以当你想将所有部分连接在一起时,你需要使用Bufferconcat 来获得一个Buffer,即转换那是一个字符串。
    • @loganfsmyth :我尝试了相同的方法,但是每当我点击 url 时,服务器都会抛出 500 内部服务器错误。我被困在这里,任何想法都会有很大帮助
    • @AmandaG 请发布一个新问题,我很乐意提供帮助。
    • @loganfsmyth :请找到我的问题的链接stackoverflow.com/questions/16668941/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多