节点js不立即发送http请求

时间:2016-05-23 17:58:30

标签: node.js

我在node.js上有简单的服务器和cilent: 客户端:

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请求已经发送,但实际上它没有被发送。它将在所有工作完成后发送

1 个答案:

答案 0 :(得分:0)

使用child_process.fork解决问题: 添加了新文件requestsender.js:

organization.admin

并在client.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);
        }
    }
});