节点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请求已发送,但实际上并未发送。所有工作完成

+2

我不明白你在问什么。请更详细地解释你观察到的以及你的期望。 – jfriend00

+0

多行代码在评论中无法阅读。如果您想向我们展示更多包含代码的信息,请使用“编辑”链接将其添加到问题的末尾,并发布评论以指示您添加的内容。此外,请将您的第一条评论添加到您的问题本身以澄清它。人们应该能够自己阅读这个问题,而不用阅读评论,并且知道你所问的一切。 – jfriend00

+0

P.S. 'makehttprequest()'中的所有变量应该用'var'声明,因此它们不是可能相互冲突的隐式全局变量。 – jfriend00

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