使用 Google 地图 API 进行反向地理编码的 Axios 块请求

Axios chunk requests for reverse geocoding with Google Maps API

请帮忙!我正在尝试使用 nodejs、axios 和 google 地图 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
}

最终结果是记录有未决的承诺,几秒钟后出现几个 'socket hang up' 错误代码 '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',

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

我自己找的。实际上是非常愚蠢的错误。所以在 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)
}