ฉันมีปัญหาในการส่งข้อมูลอาร์เรย์จาก client.js ของฉันไปยังเซิร์ฟเวอร์โหนดโดยใช้คำขอ http POST หลังจากผ่านไปสองสามวัน ฉันคิดว่าฉันได้จำกัดขอบเขตให้แคบลงแล้ว
การตั้งค่าปัจจุบันของฉันมีดังต่อไปนี้:
เซิร์ฟเวอร์
- หลังจากระยะเวลา X เซิร์ฟเวอร์จะเริ่มขอให้ลูกค้าส่งข้อมูลที่รวบรวมไว้
- เซิร์ฟเวอร์จะส่งคำขอครั้งละหนึ่งคำขอเท่านั้น เพื่อรอรับข้อมูลไคลเอ็นต์นั้นก่อนที่จะส่งคำขอไปยังไคลเอ็นต์ถัดไป
ลูกค้า
- ลูกค้าได้รับการร้องขอจากเซิร์ฟเวอร์
- ตั้งค่าสิ่งที่ Http เพื่อส่งคำขอ POST แล้ว
- ข้อมูลอาร์เรย์จะถูกแปลงเป็น json
- รอ 1,000 มิลลิวินาทีก่อนที่จะส่งคำขอโพสต์ http
เซิร์ฟเวอร์
- ได้รับคำขอโพสต์ & ข้อมูลนั้นถูกเพิ่มลงในอาร์เรย์ในเครื่อง
เซิร์ฟเวอร์ของฉัน js
var http = require('http')
, connect = require('connect')
, io = require('socket.io')
, fs = require('fs')
, uuid = require('node-uuid')
, _ = require('lodash');
// omitted event handers & pubnub setup
var app = connect().use(connect.static(__dirname)).use(connect.directory(__dirname));
var server = http.createServer(app);
server.listen(8888);
io = io.listen(server);
// Following handles sending request to clients
function phaseTwo() {
var count = 0;
setTimeout(function() {
pubnub.publish({
channel: 'channel' + viewers[count],
message: { message: 'measurements',
uuid: 'Server',
receiver: viewers[count] }
});
// set up server to listen for http POST
app.use(function(req, res) {
if (req.method == 'POST') {
count++;
req.on('data', function(chunk) {
// add that array into one main array
latencyData.push.apply(latencyData, chunk);
dataCollected++;
});
pubnub.publish({
channel: 'channel' + viewers[count],
message: { message: 'measurements',
uuid: 'Server',
receiver: viewers[count] }
});
}
}); // end app.use
}, msDuration);
}
ลูกค้า
if (message.message == 'measurements') {
console.log(' Received measurements event');
var http = new XMLHttpRequest();
var url = 'http://localhost:8888/';
http.open('POST', url, true);
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
// http.setRequestHeader("Content-length", latency.length);
// http.setRequestHeader("Connection", "close");
var myJsonString = JSON.stringify(latency);
setTimeout( function() {
http.send(myJsonString);
}, 1000);
}
ปัญหาคือว่าหากไม่มีความล่าช้า 1,000 มิลลิวินาทีในฝั่งไคลเอ็นต์ เซิร์ฟเวอร์ก็จะไม่ได้รับข้อมูลทั้งหมดของไคลเอ็นต์ ที่แย่ไปกว่านั้นคือ เมื่อพยายามขยายขนาดไคลเอนต์ไม่กี่ร้อยราย จะไม่มีการโพสต์ http ไปยังเซิร์ฟเวอร์อีกต่อไปหลังจากไคลเอนต์ 240 รายส่งข้อมูลของพวกเขาแล้ว (มี RAM เพียงพอสำหรับพวกเขา)
เพื่อไม่ให้ไคลเอ็นต์ส่งคำขอ POST ล่าช้า เซิร์ฟเวอร์ควรรอให้ไคลเอ็นต์ปัจจุบันส่งข้อมูลของตนก่อนที่จะดำเนินการต่อ ปัญหาอื่น ๆ ก็คือแม้ว่าจะมีลูกค้าต่ำกว่า 240 ราย เช่น กำลังทดสอบลูกค้า 200 ราย แม้ว่าจะได้รับข้อมูลเพียงประมาณ 10% เท่านั้นก็ตาม (สิ่งนี้ถูกเขียนลงในไฟล์ข้อความในตอนท้าย)
ฉันใหม่มากในการใช้ http post/get stuff ดังนั้นฉันคิดว่านั่นคือปัญหา มีอะไรผิดปกติในทันทีจากใครก็ตามที่ประสบกับ http หรือ nodejs หรือไม่?
แก้ไข: ฉันพบข้อผิดพลาดอย่างหนึ่ง กลับไปที่ฝั่งเซิร์ฟเวอร์ ในการโพสต์คำขอข้อมูลใดก็ตามที่ได้รับจากเซิร์ฟเวอร์จะถูกเพิ่มลงในอาร์เรย์ภายในเครื่องบนเซิร์ฟเวอร์ทันทีโดยไม่ต้องตรวจสอบให้แน่ใจก่อนว่าเป็นอาร์เรย์ ฉันไม่แน่ใจนักว่าสิ่งนี้จะทำลายสิ่งต่าง ๆ มากพอที่จะเป็นต้นตอของปัญหาของฉันหรือไม่