我有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的请求。

10-06 00:10