向Nodejs Server发送Http POST请求的问题

时间:2014-07-11 17:23:59

标签: javascript node.js http xmlhttprequest http-post

我遇到一个问题,即使用http POST请求从我的client.js向节点服务器发送一组信息。几天之后,我想我已经把它缩小了。

我目前的设置如下:

服务器

  • 经过X段时间后,服务器将开始要求客户发送收集的数据。
  • 服务器一次只发出一个请求,等待在向下一个客户端发送请求之前接收客户信息

客户端

  • 客户端收到服务器的请求
  • 设置发送POST请求的Http内容
  • 阵列数据转换为json
  • 在发送http post请求之前等待1000毫秒

服务器

  • 收到邮寄请求&该数据被添加到本地数组

我的server.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);

  }

问题是如果客户端没有1000ms的延迟,服务器就不会收到所有客户端的数据。更糟糕的是,当尝试扩展几百个客户端时,在240个客户端发送了他们的信息之后,没有更多的http帖子被发送到服务器(对他们来说有足够的内存)

在发出POST请求的客户端上没有任何延迟,服务器应该等待当前客户端在继续之前发送其信息。另一个问题是,即使在240个客户端下,也就是测试200个客户端,即使没有延迟,也只收到大约10%的数据(这些内容最后被写入文本文件)

我非常擅长使用http post / get stuff,所以我觉得这就是问题所在。 任何人使用http或nodejs的东西都有什么问题吗?

编辑:我发现了一个错误。回到服务器端,在post请求中,从服务器获取的任何数据都会立即添加到服务器上的本地阵列,而不首先确定它是一个数组。我不完全确定这是否会破坏我的问题的根源

2 个答案:

答案 0 :(得分:0)

使用Express可以非常简单地处理POST。

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

答案 1 :(得分:0)

在服务器中设置适当的路由以处理传入请求,使您的应用知道这些路由。

您可以console.log(req)在服务器端检查它如何处理所有数据。