节点JS不发送HTTP请求立即
问题描述:
我有简单的服务器和cilent上的node.js: 客户端:节点JS不发送HTTP请求立即
var TestHost = 'localhost';
makehttprequest('o1','n1');
t = 1;
for (var i = 0; i < 1000000000; i++) {
t = t + i;
};
makehttprequest('o2', 'n2');
function makehttprequest(OldID, NewID) {
options = {
host: TestHost,
path: '/?OldID='+OldID+'&NewID='+NewID,
port: 4444
};
console.log('sending http get');
http = require('http');
http.request(options).end();
console.log('http request was sent');
} }
服务器:
var http = require("http");
var url = require("url");
function onRequest(request, response) {
console.log('onRequest');
request.setEncoding("utf8");
var strOldID = url.parse(request.url, true).query.OldID;
var strNewID = url.parse(request.url, true).query.NewID;
var body = '';
if ((strOldID !== undefined)&&(strNewID !== undefined)){
body+='answer for '+strNewID + strOldID;
console.log(body);
}else {
body+='err';
}
response.end();
}
function makeuserresponse(response, body) {
response.writeHead(200, {
"Content-Type": "text/html"
});
response.write(body);
response.end();
}
http.createServer(onRequest).listen(4444);
在该案例服务器在第二次请求后同时收到两个请求。我不明白为什么会发生。为什么node.js不立即提出第一个请求?
我不在乎这个请求是同步还是异步,我只是想在请求之后马上发送第一个请求。
我看到这个:客户端发送第一个请求,然后做一些长时间的工作,然后发送第二个请求。但我看到这一点:客户端实际上不发送第一个请求,他在长时间的工作后发送了两个请求。在第一个请求后的控制台中,我看到:http请求已发送,但实际上并未发送。所有工作完成
答
后使用child_process.fork的解决问题,它会发送: 添加新的文件requestsender.js:
var AdmHost = 'localhost';
function send_request(OldID, NewID) {
var options = {
host: AdmHost,
path: '/?OldID=' + OldID + '&NewID=' + NewID,
port: 4444
};
var http = require('http');
http.request(options).end();
}
process.on('message', function(msg) {
if (msg.type == 'sendrequest') {
if ((msg.OldID !== undefined) && (msg.NewID !== undefined)) {
send_request(msg.OldID, msg.NewID);
}
}
});
和client.js使这个:
var sender = require('child_process').fork(__dirname + '/requestsender.js');
send_request('o1', 'n1');
require('child_process').execSync("calc");
send_request('o2', 'n2');
sender.disconnect();
function send_request(OldID, NewID) {
msg = {
type: 'sendrequest',
OldID: OldID,
NewID: NewID
}
sender.send(msg);
}
我不明白你在问什么。请更详细地解释你观察到的以及你的期望。 – jfriend00
多行代码在评论中无法阅读。如果您想向我们展示更多包含代码的信息,请使用“编辑”链接将其添加到问题的末尾,并发布评论以指示您添加的内容。此外,请将您的第一条评论添加到您的问题本身以澄清它。人们应该能够自己阅读这个问题,而不用阅读评论,并且知道你所问的一切。 – jfriend00
P.S. 'makehttprequest()'中的所有变量应该用'var'声明,因此它们不是可能相互冲突的隐式全局变量。 – jfriend00