我是 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();
}
我收到了损坏的数据,因此我插入了一个 sleep 函数:
res.on('data', function (chunk) {
data = data + chunk;
sleep(20);
});
我仍然想知道是否有更好的方法? 非常感谢!
注意:这是我的 sleep 功能:
function sleep(milliseconds) {
var start = new Date().getTime();
for (var i = 0; i < 1e7; i++) {
if ((new Date().getTime() - start) > milliseconds){
break;
}
}
}
更多详细信息:
- 1 次请求的平均数据长度为 5000~5500 个字符
- 我提出了 500 个请求
- 因此总数据长度变为 2700285
- 数据采用 Base64 编码
- 没有 sleep 功能 %10 的数据已损坏
- 随着 sleep(1) 损坏的数据减少到 %5
- 随着 sleep(10) 损坏,数据减少至 %2
- 随着 sleep(20),损坏的数据减少到 %1
- 如果我增加 sleep 时间,我会得到更好的结果。
最佳答案
在阅读你的代码时,我注意到即使有相同的评论,
您需要在函数内部而不是外部设置数据。
所以它变成了局部变量。
在你的函数中数据变量是全局的。
因为使用 sleep() 函数可以获得更好的结果; javascript 需要一些时间来覆盖全局数据。这解释了为什么你会得到更好的结果。
只需像这样编写并从 js 文件的上行删除 var data;
即可。
var data = '';
res.on('data', function (chunk) {
data = data + chunk;
});
关于javascript - Node.js 请求数据损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29960326/