У меня есть веб-сайт, которому нужно получить Широту и Долготу, соответствующие адресу пользователя, а затем ввести информацию в мою базу данных (mongodb).
Google / Bing / Yahoo слишком дороги для нас, поэтому мы пошли с OpenStreetMap / Nominatim.
Мой код следующий:
const options = {
provider: 'openstreetmap',
};
const geoCoder = NodeGeocoder(options);
geoCoder
.geocode({
city: Adresse_fixe_ville,
zipcode: Adresse_fixe_postal,
})
.then(async (res) => {
const Latitude = res[0].latitude;
const Longitude = res[0].longitude;
//CREATE A STUDENT WHITH THE INFO + LAT AND LONG
student = new Student({
Civilite,
Nom_patronymique,
Prenom,
Date_naissance,
No_etudiant,
Libelle_nationalite,
Telephone_portable,
Mailum,
Adresse_fixe_postal,
Adresse_fixe_ville,
Libelle_etape,
Latitude,
Longitude,
});
//VERIFICATION of undefined .....
) {
//SAVE THE STUDEN IN THE DATABASE
await student.save();
} else {
//Res error .....
}
})
Все работает хорошо, когда я имею дело с небольшим объемом данных. (для менее чем 40 пользователей) Но когда я хочу загрузить свои 1300 пользователей, он блокируется во время процесса 42 пользователя. На самом деле у меня сначала есть ошибка:
TypeError: Cannot read property 'latitude' of undefined
[0] at Geocoder.<anonymous> (C:\Users\justi\Documents\GitHub\carpoolingApplication\routes\api\students.js:105:37)
[0] at Geocoder.tryCatcher (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\util.js:16:23)
.
А затем у меня появляется это сообщение об ошибке для всех пользователей, когда я пытаюсь декодировать адрес и сохранять базу данных:
HttpError: request to http://nominatim.openstreetmap.org/search?addressdetails=1&city=MONT-DE-MARSAN&zipcode=40000&format=json failed, reason: connect ETIMEDOUT 130.117.76.9:80
[0] at C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\lib\httpadapter\fetchadapter.js:47:15
[0] at tryCatcher (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\util.js:16:23)
[0] at Promise._settlePromiseFromHandler (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\promise.js:547:31)
[0] at Promise._settlePromise (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\promise.js:604:18)
[0] at Promise._settlePromise0 (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\promise.js:649:10)
[0] at Promise._settlePromises (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\promise.js:725:18)
[0] at _drainQueueStep (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\async.js:93:12)
[0] at _drainQueue (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\async.js:86:9)
[0] at Async._drainQueues (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\async.js:102:5)
[0] at Immediate.Async.drainQueues [as _onImmediate] (C:\Users\justi\Documents\GitHub\carpoolingApplication\node_modules\node-geocoder\node_modules\bluebird\js\release\async.js:15:14)
[0] at processImmediate (internal/timers.js:456:21) {
[0] name: 'HttpError',
[0] message: 'request to http://nominatim.openstreetmap.org/search?addressdetails=1&city=MONT-DE-MARSAN&zipcode=40000&format=json failed, reason: connect ETIMEDOUT 130.117.76.9:80',
[0] code: 'ETIMEDOUT'
[0] }
Я провел много исследований по этой проблеме, но не могу найти решение или альтернативу. Я знаю о политике использования nominatim (https://operations.osmfoundation.org/policies/nominatim/?fbclid=IwAR1amydpXK6TXhWk_DPKwkeRGwFz4Z6OyQpp6DYcpklEZx_6m1e9JpkgvMQ). И я думаю, что сделал слишком много запросов. Но как я могу решить эту проблему?
Спасибо за вашу помощь!