我有1,211,434个IP地址需要转换为地理位置。我找到了一个使用GET请求回答此问题的API。但问题是,在使用for循环时,我无法发送IP地址并正确接收描述。
我主要有两个问题:
我只是无法输出ip_and_info
数组,也找不到原因。谁能告诉我出了什么问题?
现在,我编写的代码可以检索我需要的所有信息,test_ip.txt中大约有200个IP地址。如果我尝试发送所有这些1M IP地址,会不会有潜在的问题?
有没有人可以给我一些建议?
非常感激。
我的代码如下:
fs = require('fs')
async = require("async")
http = require('http')
ip_and_info = []
// getIPInfo("1.171.58.24")
fs.readFile("../test_ips.txt", "utf-8", (err, content, printArr) => {
content = content.split("\n")
async.each(content, (ip) => {
content = getIPInfo(ip)
// console.log(ip)
}, (err) => {
if (err) {
console.log(err)
} else {
console.log(ip_and_info)
}
})
// for (i in content) {
// ((ip) => {
// getIPInfo(ip)
// })(content[i])
// }
});
function getIPInfo(ipAddress) {
options = {
host: 'freegeoip.net',
path: '/csv/' + ipAddress
}
request = http.get(options, function(response) {
// console.log('STATUS: ' + response.statusCode)
// console.log('HEADERS: ' + JSON.stringify(response.headers))
// Buffer the body entirely for processing as a whole.
bodyChunks = []
response.on('data', function(chunk) {
bodyChunks.push(chunk)
}).on('end', function() {
body = Buffer.concat(bodyChunks)
content = body.toString('ascii')
ip_and_info.push(content)
console.log(content)
return content
})
})
request.on('error', function(e) {
console.log('ERROR: ' + e.message)
})
}
非常感激!
最佳答案
问题在于这条线content = getIPInfo(ip)
getIPInfo应该是一个异步函数。一种方法是将回调发送给函数,然后在函数中返回回调中的输出。
async.each(content, getIPInfo, (err) => {
if (err) {
console.log(err)
} else {
console.log(ip_and_info)
}
})
并在getIPInfo函数中
function getIPInfo(ipAddress, callback) {
.....
.....
ip_and_info.push(content)
callback();
}
另外,与其使用async.each而不是async.eachSeries或async.eachLimit,否则它将尝试发送所有1,211,434 ips的请求。