ปัญหาในการส่งคำขอ Http POST ไปยังเซิร์ฟเวอร์ Nodejs

ฉันมีปัญหาในการส่งข้อมูลอาร์เรย์จาก 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 หรือไม่?

แก้ไข: ฉันพบข้อผิดพลาดอย่างหนึ่ง กลับไปที่ฝั่งเซิร์ฟเวอร์ ในการโพสต์คำขอข้อมูลใดก็ตามที่ได้รับจากเซิร์ฟเวอร์จะถูกเพิ่มลงในอาร์เรย์ภายในเครื่องบนเซิร์ฟเวอร์ทันทีโดยไม่ต้องตรวจสอบให้แน่ใจก่อนว่าเป็นอาร์เรย์ ฉันไม่แน่ใจนักว่าสิ่งนี้จะทำลายสิ่งต่าง ๆ มากพอที่จะเป็นต้นตอของปัญหาของฉันหรือไม่


person JerryFox    schedule 11.07.2014    source แหล่งที่มา
comment
มีเหตุผลที่คุณไม่ได้ใช้ express และเชื่อมต่อ body parser หรือไม่?   -  person Charlie Key    schedule 11.07.2014
comment
เซิร์ฟเวอร์ที่ฉันได้รับตอนนี้เป็นเพียงสิ่งที่ฉันตั้งค่าอย่างรวดเร็วเพื่อแสดงเพจคงที่ของ 2 หน้า html มีปัญหาที่อาจเกิดขึ้นกับสิ่งนี้หรือไม่?   -  person JerryFox    schedule 11.07.2014
comment
ไม่มีปัญหาในการทำสิ่งนี้ด้วยแกน แค่ทำให้ชีวิตคุณยากขึ้นด้วยการทำมัน   -  person Charlie Key    schedule 11.07.2014
comment
นั่นเป็นเรื่องจริง ฉันอาจพยายามปรับให้เหมาะสมหลังจากที่ฉันได้ทำงานนี้แล้ว   -  person JerryFox    schedule 11.07.2014
comment
ฉันมีปัญหาในการทำความเข้าใจโค้ดบนฝั่งเซิร์ฟเวอร์: คุณกำลังอ้างอิงตัวแปร เช่น pubnub และ latencyData ที่ไม่ได้ถูกกำหนดไว้ คุณไม่ควรปล่อยให้ลูกค้ารอ 1,000 มิลลิวินาทีก่อนที่จะตอบกลับ พวกเขาควรจะสามารถตอบกลับได้ทันที บ่งบอกถึงปัญหาในการออกแบบโปรแกรม ไม่ชัดเจนว่าฟังก์ชัน PhaseTwo จะถูกเรียกใช้เมื่อใดหรือที่ไหน นอกจากนี้ ฉันจะใช้ตัวดำเนินการความเสมอภาคที่เข้มงวด === เนื่องจากการบังคับประเภท: 1 == 1; // true เกี่ยวกับการแก้ไขของคุณ: หากคุณเชื่อถือลูกค้าของคุณ ก็ไม่ควรเสียหาย คำแนะนำของฉันคือการเริ่มต้นใหม่ โปรดแจ้งให้เราทราบหากคุณมีคำถามเฉพาะเจาะจง   -  person dot slash hack    schedule 17.08.2014


คำตอบ (2)


POST สามารถจัดการได้อย่างง่ายดายด้วย Express

var express = require('express');
var bodyParser = require('body-parser');
var app = express();

app.use(express.static(__dirname + '/public'));
app.use(bodyParser()); 

app.post('/', function(req, res) {
  console.log(req.body);
  res.send('data retrieved');
});

app.listen(3000);
person Charlie Key    schedule 11.07.2014
comment
จากสิ่งที่ฉันเข้าใจ สิ่งนี้จะทำให้การตั้งค่าง่ายขึ้น แต่คุณช่วยบอกฉันได้ไหมว่าสิ่งนี้ปรับปรุงได้อย่างไร หรือแก้ไขปัญหาอะไรจากการตั้งค่าปัจจุบันของฉัน - person JerryFox; 11.07.2014

สร้างเส้นทางที่เหมาะสมในเซิร์ฟเวอร์เพื่อจัดการกับคำขอที่เข้ามาทำให้แอปของคุณทราบเส้นทางดังกล่าว

คุณสามารถ console.log(req) เพื่อตรวจสอบในฝั่งเซิร์ฟเวอร์ว่าคุณได้รับคำขอพร้อมข้อมูลทั้งหมดอย่างไร

person Akbar    schedule 30.05.2019