Как я могу вернуть массив документов, используя массив идентификаторов объектов пользователей в mongoose? - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь создать простой API-интерфейс блога с аутентификацией и авторизацией пользователей.Он построен с мангустом и экспрессом.В моем userSchema у меня есть свойство, которое представляет собой массив с именем «subscribedTo».Здесь пользователи могут подписаться на разных пользователей, чтобы получить свои блоги.В массиве subscribedTo хранятся идентификаторы объектов пользователей, которые тоже хотели подписаться.

Вот мой код:

router.get('/blogs', auth, async (req, res) => {
//auth middleware attaches user to the request obj
    try {
    let blogs = []

    req.user.subscribedTo.forEach(async (id) => {
        let ownersBlogs = await Blog.find({owner:id})
        blogs = [...blogs, ...ownersBlogs]
        console.log(blogs)//consoles desired output of users blogs
    })
    console.log(blogs)//runs first and returns []
    res.send(blogs)

    }catch(e){
    res.status(500).send(e)
    }
})

Когда я использую почтальон для этого маршрута, он возвращает [], что понятно.Кажется, я не могу выполнить res.send (блоги), хотя переменная blogs правильно возвращает значение в функции forEach.

Есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Вы можете использовать без цикла, как показано ниже

Blog.find({ owner: { $in: req.user.subscribedTo } }, function (err, blogResult) {
  if (err) {
    response.send(err);
  } else {
    response.send(blogResult);
  }
});

ИЛИ

отправить ответ после завершения цикла, как показано ниже

router.get('/blogs', auth, async (req, res) => {
  //auth middleware attaches user to the request obj
  try {
    let blogs = []
    let len = req.user.subscribedTo.length;
    let i = 0;
    if (len > 0) {
      req.user.subscribedTo.forEach(async (id) => {
        let ownersBlogs = await Blog.find({ owner: id })
        blogs = [...blogs, ...ownersBlogs]
        console.log(blogs)//consoles desired output of users blogs

        i++;
        if (i === len) {
          //send response when loop reached at the end
          res.send(blogs)
        }

      })
    } else {
      res.send(blogs);
    }

  } catch (e) {
    res.status(500).send(e)
  }
});
0 голосов
/ 23 сентября 2019

Вы можете найти все документы без цикла foreach, используйте $ in

Blog.find({owner:{$in:[array of ids]}});
...