Проблема с отправкой запроса Http POST на сервер Nodejs

У меня возникла проблема с отправкой массива информации из моего client.js на сервер узла с использованием запроса http POST. Через пару дней я думаю, что сузил его.

Моя текущая установка следующая:

Сервер

  • По прошествии X времени сервер начнет просить клиентов отправить собранные данные.
  • Сервер отправляет только один запрос за раз, ожидая получения информации об этом клиенте, прежде чем отправить запрос следующему клиенту.

Клиент

  • Клиент получает запрос от сервера
  • Настроен HTTP-материал для отправки POST-запроса.
  • Данные массива конвертируются в json
  • Ожидается 1000 мс перед отправкой почтового запроса 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);

  }

Проблема в том, что без этой задержки в 1000 мс на стороне клиента сервер не получает все данные клиента. Хуже того, при попытке масштабировать несколько сотен клиентов, http-посты больше не отправляются на сервер после того, как 240 клиентов отправили свою информацию (для них достаточно оперативной памяти)

Без задержки со стороны клиента, делающего запрос POST, сервер должен ждать, пока текущий клиент отправит свою информацию, прежде чем продолжить. Другая проблема заключается в том, что даже при менее чем 240 клиентах, скажем, при тестировании 200 клиентов, даже без задержки принимается только около 10% их данных (эти данные записываются в текстовый файл в конце)

Я очень новичок в использовании http post/get, поэтому я думаю, что проблема в этом. Есть ли что-то сразу неправильное из-за того, что кто-то сталкивался с http или nodejs?

редактировать: я нашел одну ошибку. Вернувшись на серверную сторону, в почтовом запросе любые данные, полученные с сервера, сразу же добавляются в локальный массив на сервере без предварительной проверки того, что это массив. Я не совсем уверен, что это сломает что-то достаточно, чтобы стать источником моей проблемы.


person JerryFox    schedule 11.07.2014    source источник
comment
Есть ли причина, по которой вы не используете экспресс-парсер и синтаксический анализатор соединения?   -  person Charlie Key    schedule 11.07.2014
comment
Сервер, который у меня сейчас есть, на самом деле был просто тем, что я довольно быстро настроил для отображения статической страницы из двух 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, которые не были определены. Вы не должны позволять своим клиентам ждать 1000 мс перед ответом, они должны иметь возможность ответить немедленно; Это указывает на проблему в дизайне программы. Неясно, когда и где вызывается функция 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