关于nodejs 并发请求问题
发布于 3年前 作者 ironheart 2542 次浏览

http://localhost:8080/TestNode 只是简单的输出HelloWorld

运行以下代码 控制台先输出 i 1-1000之后,才进行并发请求此服务。

请问这是什么问题? 谢谢。

    var http = require('http');
for(var i = 0; i < 1000; i ++) {
console.log(i);
var req = http.get({host:'localhost', port:8080, path:'/TestNode',agent:false},function(res) {
    resultdata = '';
    res.on('data',function(chunk) {
        resultdata += chunk;
    });

    res.on('end',function() {
        console.log('return ' + resultdata);
    });
});

req.on('error',function(err) {
    console.log('problem with request: ' + err.message);
});
}
6 回复

因为异步。 循环先结束的,而"end"事件是后触发的。

我把i的值,改到100000 看到控制台也是先走完循环,才去请求的。 如何让i一边循环,一边去执行 get请求呢。谢谢!

@ironheart 用循环是不能保证这些请求的顺序的,只能是并发。如果要挨个请求,最好是用递归调用的方式,当一个end事件触发后,再回调函数一次。

用循环是不能保证从0…100的请求顺序的

实验代码:

var http = require('http');
for(var i = 0; i < 10; i ++) {
    (
        function(i){
            var req = http.get({host:'www.baidu.com', port:80, path:'/',agent:false},function(res) {
                resultdata = '';
                res.on('data',function(chunk) {
                    resultdata += chunk;
                });

                res.on('end',function() {
                    console.log(i)
                    console.log('return ' + resultdata.length);
                });
            });

            req.on('error',function(err) {
                console.log('problem with request: ' + err.message);
            });
        }
    )(i)
}

@ironheart 再贴一个顺序请求版的:

var http = require('http');

function seqRequest(i,limit){
    var req = http.get({host:'www.baidu.com', port:80, path:'/',agent:false},function(res) {
        resultdata = '';
        res.on('data',function(chunk) {
            resultdata += chunk;
        });

        res.on('end',function() {
            console.log(i)
            console.log('return ' + resultdata.length);
            if(i<limit){
                seqRequest(i+1,limit)
            }
        });
    });

    req.on('error',function(err) {
        console.log('problem with request: ' + err.message);
    });
}

seqRequest(0,10)

@fxsjy 你好,感谢您的回复,弱弱的问一下: 在此循环中 加入console.log(i); 此代码还是打完 1-1000000 才去执行get请求 ,这是为什么呢,谢谢!

var http = require('http');
for(var i = 0; i < 1000000; i ++) {
(
    console.log(i);
    function(i){
        var req = http.get({host:'www.baidu.com', port:80, path:'/',agent:false},function(res) {
            resultdata = '';
            res.on('data',function(chunk) {
                resultdata += chunk;
            });

            res.on('end',function() {
                console.log(i)
                console.log('return ' + resultdata.length);
            });
        });

        req.on('error',function(err) {
            console.log('problem with request: ' + err.message);
        });
    }
)(i)}

@ironheart 这是正常的。 你可以这样想,循环的过程中http.get做的事情不过是把请求推送到某个队列,是立即返回的。 底层有个线程帮你把队列中的request拉出来发给host,然后得到响应后(这里有延时)最终再去回调那些事件函数。

回到顶部