2013-04-24 28 views
2

我正在向發佈的請求發送XML數據到我的node.js服務器。服務器設置爲接受發佈,並且已經通過CURL運行沒有問題的測試。現在我試圖通過來自多個REST客戶端的POST請求並通過Chrome中名爲Postman的插件獲取相同的數據。最終目標是在EXE文件啓動時接收數據到服務器。Node.JS奇數行爲接收發布數據

我遇到的問題是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中可能沒有被處理,但我不確定。

希望這可以提供足夠的細節,進入我正在嘗試做的事情。我感謝任何幫助解決這個問題。

回答

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

這工作完美。感謝發佈這個我真的很感激它。我無法找到關於此的任何數據,所以不知道解析應該在哪裏,但這是完全合理的。 只是爲了確保我得到的結果是你設置了一個數組,並將數據推送到第一個函數中的數組中。然後,所有的數據都被移動到第二個函數,基本上只抓住這些塊將它們放在一起並推動到字符串?我不明白的是Buffer的功能。將不得不對此做一些研究。再次感謝! – 2013-04-24 04:08:22

+0

@ThomDuran正確!每個'data'對象都是一個Node'Buffer',而不是一個字符串,所以當你想把所有的片斷連接在一起時,你需要使用'Buffer'的'concat'來獲得一個'Buffer',那對一個字符串。 – loganfsmyth 2013-04-24 04:25:55

+0

@loganfsmyth:我嘗試了相同的方法,但每當我點擊網址拋出代碼時,服務器都會拋出500內部服務器錯誤。我在這裏卡住任何想法都會大有幫助 – 2013-05-22 04:22:05