[英]Issue sending Http POST request to Nodejs Server
我遇到了一个问题,即使用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发布/获取内容非常陌生,所以我认为这是问题所在。 任何有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.