繁体   English   中英

将HTTP POST请求发送到Nodejs Server的问题

[英]Issue sending Http POST request to Nodejs Server

我遇到了一个问题,即使用HTTP POST请求将一系列信息从我的client.js发送到节点服务器。 几天后,我想我已经缩小了范围。

我当前的设置如下:

服务器

  • X倍的时间后,服务器将开始要求客户端发送其收集的数据。
  • 服务器一次仅发送一个请求,等待接收该客户端信息,然后再向下一个客户端发送请求

客户

  • 客户端收到服务器的请求
  • 设置发送POST请求的Http内容
  • 数组数据转换为json
  • 发送http发布请求之前需要等待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发布/获取内容非常陌生,所以我认为这是问题所在。 任何有http或nodejs经验的人都会立即发现任何错误吗?

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

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

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

您可以console.log(req)在服务器端检查它如何获取所有数据的请求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM