【问题标题】:Axios chunk requests for reverse geocoding with Google Maps API使用 Google Maps API 进行反向地理编码的 Axios 块请求
【发布时间】:2025-12-04 01:25:01
【问题描述】:

请帮忙!我正在尝试使用 nodejs、axios 和 google maps api 进行批量反向地理编码操作。这是主要功能:

function reverse_geocode (data) {
  console.log('Working...')
  let records = []

  chunks = chunkArray(data, 50) // Split data into chunks

  chunks.forEach(chunk => {

    records.push(process_chunk(chunk)) // Do the requests for each chunk then
                                      // push into array the results

  })
  console.log(records)
}

我有一组 773 个 {lat, lng} 对象,我使用这个函数将它们分成 50 个元素的块:

function chunkArray(myArray, chunk_size){
  var index = 0
  var arrayLength = myArray.length
  var tempArray = []

  for (index = 0; index < arrayLength; index += chunk_size) {
      myChunk = myArray.slice(index, index+chunk_size)
      tempArray.push(myChunk)
  }

  return tempArray
}

接下来,我将每个块传递给使用 axios.all 发出请求的异步函数:

async function process_chunk(chunk){
  const key = process.env.GOOGLE_MAPS_API_KEY
  let promises = []
  let chunk_records = []
  chunk.forEach(element => {
    query = `https://maps.googleapis.com/maps/api/geocode/json?`+
          `latlng=${element.latitude},${element.longitude}&key=${key}`+
          `&result_type=administrative_area_level_3`

    promises.push(axios.get(query)
    .catch(function(err){
      console.log(err)
    }))
  })

  let responses = await axios.all(promises)
                              .catch(function(err){
                                console.log(err)
                              })

  console.log('Responses downloaded... Processing')

  responses.forEach(function(response){
    res_data = response.data['results'][0]

    comune = res_data['address_components'][0]['long_name']
    provincia = res_data['address_components'][1]['short_name']
    lat = res_data['geometry']['location']['lat']
    lng = res_data['geometry']['location']['lng']

    chunk_records.push(
      {
        lat: lat,
        lng: lng,
        comune: comune,
        provincia: provincia
      }
    )
  })
  return chunk_records
}

最终结果是记录有待处理的承诺,几秒钟后出现几个“套接字挂起”错误,代码为“ECONNRESET”:

Listening
Working...
[
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> },
  Promise { <pending> }
]
Error: socket hang up
    at connResetException (internal/errors.js:570:14)       
    at TLSSocket.socketOnEnd (_http_client.js:440:23)       
    at TLSSocket.emit (events.js:215:7)
    at endReadableNT (_stream_readable.js:1184:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'ECONNRESET',

我做错了什么?还有其他方法可以做同样的事情吗?提前感谢您的任何建议!

【问题讨论】:

    标签: node.js google-maps-api-3 axios


    【解决方案1】:

    我自己发现的。实际上是非常愚蠢的错误。所以在reverse_geocode() 的forEach 中,我不会等待process_chunk() 返回的承诺解决。 切换到正常的for循环:

    async function reverse_geocode (data) {
      console.log('Working...')
      let records = []
    
      chunks = chunkArray(data, 50) // Split data into chunks
    
      for(let i = 0; i < chunks.length; i++){
        processed_chunk = await process_chunk(chunks[i])
        records.push(processed_chunk)
      }
      console.log(records)
    }
    

    【讨论】:

      最近更新 更多