Javascript Node.js请求数据已损坏

Javascript Node.js请求数据已损坏,javascript,node.js,express,Javascript,Node.js,Express,我是Node.js的新手 我通过Node.js从其他服务器获取数据: function get_data(data_url, a, callback) { console.log('dataurl = ' + data_url); rem_url = url.parse(data_url); console.log('hostname = ' + rem_url.hostname); console.log('host = ' + rem_url.host);

我是Node.js的新手

我通过Node.js从其他服务器获取数据:

function get_data(data_url, a, callback) {
    console.log('dataurl = ' + data_url);
    rem_url = url.parse(data_url);

    console.log('hostname = ' + rem_url.hostname);
    console.log('host = ' + rem_url.host);
    console.log('path = ' + rem_url.path);
    options = {
        hostname: rem_url.hostname,
        path: rem_url.path,
        keepAlive: true
    };

    request = http.request(options, function (res) {
        data = '';
        res.on('data', function (chunk) {
            data = data + chunk;
            sleep(20);
        });

        res.on('end', function () {
            callback(a, data);
        });

        res.on('error', function (err) {
            console.log("Error Occurred: " + err.message);
        });
    });

    request.on('error', function (e) {
        console.log('dataurl = ' + data_url);
        console.log('a = ' + a);
        console.log('problem with request: ' + e.message);
    });

    request.end();
}
我得到了坏数据,所以我插入了睡眠功能:

res.on('data', function (chunk) {
    data = data + chunk;
    sleep(20);
});
我还在想是否有更好的办法? 多谢各位

注意:这是我的睡眠功能:

function sleep(milliseconds) {
    var start = new Date().getTime();
    for (var i = 0; i < 1e7; i++) {
        if ((new Date().getTime() - start) > milliseconds){
            break;
        }
    }
}
函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
}
更多详情:

  • 一个请求的平均数据长度为5000~5500个字符
  • 我提出500个请求
  • 因此,总数据长度变为2700285
  • 数据是base64编码的
  • 没有睡眠功能%10的数据被破坏
  • 使用睡眠(1)时,中断的数据减少到%5
  • 使用睡眠(10)时,中断的数据减少到%2
  • 使用睡眠(20)时,中断的数据减少到%1
  • 如果我增加睡眠时间,我会得到更好的结果
在阅读您的代码时,我注意到即使有相同的注释, 您需要在函数内部而不是外部设置数据。 所以它变成了局部变量。 在函数中,数据变量是全局变量。 因为使用sleep()函数可以获得更好的结果;javascript需要一些时间来覆盖全局数据。这解释了为什么会得到更好的结果。 就这样写,删除
var数据来自js文件的上面几行

var data = '';
res.on('data', function (chunk) {
       data = data + chunk;

});

您正在使用
data=''创建一个全局变量。使用
var data=''将其设置为本地。与
var请求
var rem\u url
var选项
相同。我已经做过了。但它超出了功能范围。这是完整的代码wat。对不起,在我看之前,你真的需要把它分解成更小的、命名良好的函数。应该有一个关于('success',…)
的事件?!你可以用它来代替('data',…)上的
和('end',…)上的
。你能解释更多吗。谢谢你,马塞尔