【发布时间】:2017-08-29 07:27:50
【问题描述】:
我有 1,211,434 个 IP 地址需要转换为地理位置。我找到了一个通过使用 GET 请求来回答这个问题的 api。但问题是,当使用 for 循环时,我无法发送 ip 地址并正确接收描述。
我主要有两个问题:
就是无法输出
ip_and_info数组,找不到原因。谁能告诉我出了什么问题?现在,我编写的代码可以检索我需要的所有信息,test_ip.txt 中有大约 200 个 ip 地址。如果我尝试发送所有这 100 万个 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)
})
}
非常感谢!
【问题讨论】:
-
这不是问题,但您的代码正在成为The Horror of Implicit Globals 的牺牲品(这是我贫血的小博客上的帖子) - 声明您的变量。
-
你需要 promises 将所有异步进程推送到数组中并一起解决
-
您的代码应该只打印空数组。那是因为您的循环将在 getIPInfo() 解决之前完成执行。正如@VinodLouis 所说,您可以在 Promises 的帮助下处理这个问题。如果您对承诺不满意,请告诉我。我会尝试提出解决方案。
标签: javascript node.js asynchronous callback async.js