В вашем контроллере
Убедитесь, что вы await
получаете ответ от вашего сервиса.
let response = await CarService.setLocationOfCars(carsLocationArray);
В вашем "сервисе"
Я бы, наверное,замените _.forEach
обычным циклом for
.В вашем случае что-то вроде следующего, гарантирующее, что gateway.id
действительно определено и значение, которое вы хотите вернуть к вызывающему коду (в вашем вопросе нет ссылки на gateway
).
for (let car of cars) {
let attributesToUpdate = {};
if (car.hasOwnProperty("latitude")) {
attributesToUpdate.latitude = car.latitude;
}
if (car.hasOwnProperty("longitude")) {
attributesToUpdate.longitude = car.longitude;
}
await Car.updateOne({
id: car.id
}).set(attributesToUpdate);
// Where does gateway.id come from?
arrayOfIdsUpdated.push(gateway.id)
}
Тосказал, что это будет выполнять cars.length
количество запросов к базе данных, а не "используя только один запрос".
Но почему бы не _.forEach?
Использование обратного вызова async
внутри forEach, как нене похоже, что он будет делать то, что вы, вероятно, хотите, чтобы он делал.Вполне вероятно, что ваш arrayOfIdsUpdated
будет возвращен вашему коду контроллера пустым, за до любого из вызовов updateOne
run.
Возьмем, к примеру,
const _ = require('lodash');
function doNothing() {
return new Promise((resolve, reject) => {
setTimeout(resolve, 0)
});
}
var foos = [1, 2, 3, 4, 5, 6]
_.forEach(foos, async (foo) => {
await doNothing();
console.log(`Finished #${foo}`);
});
console.log('Done!')
При запуске он выдает
Done!
Finished #1
Finished #2
Finished #3
Finished #4
Finished #5
Finished #6
Обратите внимание, как «Готово!»регистрируется в консоли перед тем, как await
отправит ответ в обратный вызов forEach.