Итак, я пытаюсь построить конечную точку 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",
}, {..}
]