Я считаю, что проблема в вашем коде заключается в функции user.products.map(...)
, потому что вы никогда не ждете разрешения всех обещаний, которые вы создаете на карте.
Другими словами, функция map
возвращает массив ожидающих обещаний, но он не будет ждать их выполнения, и поэтому выполнение продолжается до тех пор, пока остальная часть кода не достигнет res.status(...)
, прежде чем какой-либо код в map
будет выполнен.
У вас есть разные варианты ее решения, но в основном вам нужно позаботиться о массиве обещаний, возвращаемых функцией map
, и дождаться их завершения, прежде чем завершать код. * async/await
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 101 * * * * * * * * * Я обычно использую функцию * Promise.all()
, которая возвращает одно обещание из массив обещаний, и поэтому вы можете подождать, пока код в map
не будет выполнен параллельно для каждого элемента в массиве (т.е. product
в вашем случае). Подробнее об этом можно прочитать в документации MDN .
// ...
let promisesArray = user.products.map(async product => {...});
// promisesArray should look like: [Promise { <pending> }, Promise { <pending> }, … ]
// Using Promise.all we wait for each of them to be done in parallel
await Promise.all(promisesArray);
// Now you are certain the code in the map has been executed for each product
// ...
Хорошей практикой также является использование блока try {} catch(err) {}
вокруг Promise.all()
для обработки случаев отклонения некоторых обещаний. .