Как L oop через огромный JSON файл и вызов внешнего API для геокодирования, используя Nodejs и HERE API? - PullRequest
0 голосов
/ 26 апреля 2020

Итак, я пытаюсь построить конечную точку API с Node.js и Express. js. Одна из моих конечных точек использует API разработчика HERE для геокодирования адресов, которые я передаю как функцию.

В моем промежуточном программном обеспечении utils-helpers у меня есть объект с именем Location, в котором есть функция с именем explodeAddress, которая принимает address в качестве параметра и вернул геокодированный объект, используя HERE API. На мой взгляд, эта функция работает просто отлично. Итак, давайте двигаться дальше.

В моем контроллере place я пытаюсь использовать эту функцию explodeAddress и l oop через огромный массив объектов, содержащих адреса, и геокодировать каждый адрес в массиве.

Моя проблема в том, что если я выполняю for (let i = 0; i < 10; i++) {...} в моем place контроллере, все работает нормально, и я получаю то, что хочу. Но если я попытаюсь выполнить l oop по всему массиву (4000 записей / объектов), как, например, for (let i = 0; i < content.length; i++) {...}, функция никогда не разрешится, а затем завершится сбоем.

Я думаю, что у меня есть ключ к пониманию проблемы. API, вероятно, пытается ограничить количество запросов, которые я могу сделать. Поэтому я боролся с тем, как заставить мой l oop работать с моим огромным набором данных. Я думаю, что я должен использовать setTimeout() или setInterval() или что-то подобное, но я не знаю точно, где это сделать.

Как вы можете видеть в моем коде, я пытался включить его в разные места, но безуспешно.

Пожалуйста, помогите мне с этим.

// ./helpers/utils-helpers.js
const { 
    HERE_KEY, 
    HERE_GEOCODE_API_BASE
} = process.env;

module.exports = {
  Location: {
        explodeAddress: async (address) => {
            try {
                // setTimeout(async() => {
                    let obj;
                    const url = (HERE_GEOCODE_API_BASE + '?q=' + address.toString() + '&apiKey=' + HERE_KEY).toString();
                    // console.log(url)
                    let geocodedObj = await fetch(url);
                    geocodedObj = await geocodedObj.json();
        
                    obj = geocodedObj;
                    // console.log(HERE_KEY);
                    // console.log(obj);
                    if (!geocodedObj) {
                        console.log('nothing')
                    }
                    // console.log(obj['items'][0])
                    return obj['items'] ? obj['items'][0] : {};
                // }, 2000);
            } catch (error) {
                console.log(error)
            }
            
        },
    },
}

// ../controllers/place.js

const { Location } = require('../helpers/utils-helpers');

const placesJSON = require('../data/places.json')
module.exports = {
  explod: async(req, res, next) => {
        try {
            let content = placesJSON
            let arr = []
            for (let i = 0; i < content.length; i++) {
                let element = content[i].address;
                let geoExploded = await Location.explodeAddress(element).then(data => {return data});
                // console.log(geoExploded)
                // arr.push(geoExploded)
                content[i].exploded = geoExploded
            }
            res.json(content)
        } catch (error) {
            console.log(error)
        }
    },

}

// /api/places
const router = require('express-promise-router')();
const PlaceController = require('../controllers/place');
router.route('/places')
    // explod all places address
    .get(PlaceController.explod) 

// ./data/places.json [about 4,000 places and growing]
[
  {
    "address": "123 Main St, San Francisco CA 94102",
  }, {..}
]
...