我遇到一个问题,即使用http POST请求从我的client.js向节点服务器发送一组信息。几天之后,我想我已经把它缩小了。
我目前的设置如下:
服务器
客户端
服务器
我的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请求中,从服务器获取的任何数据都会立即添加到服务器上的本地阵列,而不首先确定它是一个数组。我不完全确定这是否会破坏我的问题的根源
答案 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)
在服务器端检查它如何处理所有数据。