Ax ios чанк запросов для обратного геокодирования с Google Maps API - PullRequest
0 голосов
/ 27 марта 2020

Пожалуйста, помогите! Я пытаюсь выполнить пакетную операцию обратного геокодирования, используя nodejs, ax ios и API Google Maps. Это основная функция:

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
}

Далее, Я передаю каждый кусок функции asyn c, которая выполняет запросы с использованием ax ios .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',

Что я делаю не так? Есть ли другие способы сделать то же самое? Заранее спасибо за любые предложения!

1 Ответ

0 голосов
/ 27 марта 2020

Я выясняю это сам. Довольно глупая ошибка на самом деле. Так что в forEach в reverse_geocode() я не жду, пока не вернется обещание, возвращенное process_chunk(). Переключено на нормальное значение для l oop:

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)
}
...