Как сделать вложенные асинхронные запросы?

Всем привет.
Задача мне показалась на первый взгляд простой, но уже 2 часа сижу над ней.

Пишу rest api на node js.

Есть роутер(express) который принимает 2 параметра в поле запроса(query params) ->
http://localhost:5000/api/item/?title=new task&user_id=1


Я достаю эти параметры на сервере ->
router.get('/', async (req, res) => { 
const {title,user_id} = req.query
})


Далее мне надо по этим параметрам получить все совпадения с базы.
router.get('/', async (req, res) => { 
const {title,user_id} = req.query
const items = await Item.findAll({ where: { title, user_id } })
})

и потом надо прогнать через цикл массив items и при каждой итерации доставать у каждого элмента items -> user_id, делать запрос в базу и получать определенные данные о пользователе который создал этот item, и в конечном итоге массив с объектами items(+плюс у каждого айтемса добавленные данные о пользователе) вернуть клиенту.

Примерно такую логику я ждал :

let result = await items.map(async (item) => {
      const { title, phone, name, email } = await User.findByPk(item.user_id)
      return {
        id: item.id,
        title: item.title,
        price: item.price,
        image: item.image,
        createdAt: item.createdAt,
        user: { title, phone, name, email }
      }
    })
    res.json({ valid: true, data: result })


Но из за того что в цикле происходит асинхронность, то на каждой итерации возвращается промис, по итогу я получаю вот такой результат:
"data": [
        {}
    ]


Пробовал await, then,callback

Подскажите как решить данную задачу ?
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
Проблема в моменте с await items.map(...)
т.к. map возвращает массив - а не промис - то никакого ожидания не происходит. Можно как посоветовали выше не использовать .map, или воспользоваться Promise.all:
let result = await Promise.all(items.map(async (item) => {}))
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы