Masalah saat mengirim permintaan Http POST ke Server Nodejs

Saya mengalami masalah saat mengirimkan berbagai informasi dari client.js saya ke server node menggunakan permintaan http POST. Setelah beberapa hari saya pikir saya telah mempersempitnya.

Pengaturan saya saat ini adalah sebagai berikut:

pelayan

  • Setelah jangka waktu X, server akan mulai meminta klien untuk mengirimkan data yang dikumpulkan.
  • Server hanya mengirimkan satu permintaan pada satu waktu, menunggu untuk menerima informasi klien sebelum mengirim permintaan ke klien berikutnya

Klien

  • Klien menerima permintaan dari server
  • Barang Http untuk mengirim permintaan POST sudah diatur
  • Data array dikonversi ke json
  • 1000ms ditunggu sebelum mengirim permintaan posting http

pelayan

  • Permintaan posting diterima & data tersebut ditambahkan ke array lokal

Server saya.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);
}

klien

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

  }

Masalahnya adalah tanpa penundaan 1000ms di sisi klien, server tidak menerima semua data klien. Lebih buruk lagi, ketika mencoba meningkatkan beberapa ratus klien, tidak ada lagi posting http yang dikirim ke server setelah 240 klien mengirimkan info mereka (ada cukup ram untuk mereka)

Tanpa penundaan pada klien yang membuat permintaan POST, server harus menunggu klien saat ini mengirimkan informasinya sebelum melanjutkan. Masalah lainnya adalah bahkan dengan kurang dari 240 klien, katakanlah menguji 200 klien, bahkan tanpa penundaan hanya sekitar 10% dari data mereka yang diterima (hal ini ditulis ke file teks di bagian akhir)

Saya sangat baru dalam menggunakan http post/get stuff jadi menurut saya itulah masalahnya. Apakah ada yang salah dari pengalaman seseorang dengan http atau nodejs?

sunting: Saya menemukan satu kesalahan. Kembali ke sisi server, pada permintaan posting, data apa pun yang diperoleh dari server langsung ditambahkan ke array lokal di server tanpa terlebih dahulu memastikan itu adalah array. Saya tidak sepenuhnya yakin apakah ini akan cukup merusak dan menjadi sumber masalah saya


person JerryFox    schedule 11.07.2014    source sumber
comment
Apakah ada alasan Anda tidak menggunakan express dan connect body parser?   -  person Charlie Key    schedule 11.07.2014
comment
Server yang saya dapatkan saat ini hanyalah sesuatu yang saya siapkan dengan cukup cepat untuk menampilkan halaman statis dari 2 halaman html. Apakah ada kemungkinan masalah dengan ini?   -  person JerryFox    schedule 11.07.2014
comment
Tidak ada masalah melakukan ini dengan inti hanya membuat hidup Anda lebih sulit dengan melakukannya.   -  person Charlie Key    schedule 11.07.2014
comment
itu benar. Saya mungkin mencoba mengoptimalkannya setelah ini berfungsi   -  person JerryFox    schedule 11.07.2014
comment
Saya kesulitan memahami kode di sisi server: Anda mereferensikan variabel seperti pubnub dan latencyData yang belum ditentukan. Anda tidak perlu membiarkan klien Anda menunggu 1000 md sebelum merespons, mereka harus dapat merespons dengan segera; Ini menunjukkan adanya masalah dalam desain program. Tidak jelas kapan atau di mana fungsi PhaseTwo dipanggil. Saya juga akan menggunakan operator kesetaraan yang ketat ===, karena jenis paksaan: 1 == 1; // true Tentang hasil edit Anda: Jika Anda memercayai klien Anda, hasil edit tersebut tidak akan rusak. Saran saya adalah memulai kembali. Beri tahu saya jika Anda memiliki pertanyaan spesifik.   -  person dot slash hack    schedule 17.08.2014


Jawaban (2)


Sebuah POST dapat ditangani dengan cukup sederhana dengan 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
Dari apa yang saya pahami, hal ini memang membuat penyiapan menjadi lebih sederhana, tetapi dapatkah Anda memberi tahu saya bagaimana peningkatannya atau masalah apa yang diperbaiki dari penyiapan saya saat ini? - person JerryFox; 11.07.2014

Buat rute yang tepat di server untuk menangani permintaan masuk, buat aplikasi Anda mengetahui rute tersebut.

Anda dapat console.log(req) memeriksanya di sisi server bagaimana Anda mendapatkan permintaan dengan semua data.

person Akbar    schedule 30.05.2019