Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用mongoose中的用户对象ID数组返回文档数组?_Javascript_Express_Asynchronous_Mongoose_Async Await - Fatal编程技术网

Javascript 如何使用mongoose中的用户对象ID数组返回文档数组?

Javascript 如何使用mongoose中的用户对象ID数组返回文档数组?,javascript,express,asynchronous,mongoose,async-await,Javascript,Express,Asynchronous,Mongoose,Async Await,我正在尝试创建一个简单的后端博客api,带有用户身份验证和授权。它是用猫鼬和express建造的。在我的userSchema中,我有一个名为“subscribedTo”的数组属性。在这里,用户可以订阅不同的用户以获得他们的博客。subscribedTo数组存储希望订阅的用户的objectid 这是我的密码: router.get('/blogs', auth, async (req, res) => { //auth middleware attaches user to the requ

我正在尝试创建一个简单的后端博客api,带有用户身份验证和授权。它是用猫鼬和express建造的。在我的userSchema中,我有一个名为“subscribedTo”的数组属性。在这里,用户可以订阅不同的用户以获得他们的博客。subscribedTo数组存储希望订阅的用户的objectid

这是我的密码:

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)
    }
})
当我在这条路线上使用邮递员时,它返回[],这是可以理解的。即使blogs变量在forEach函数中正确返回,我似乎也无法res.send(blogs)

有更好的方法吗?

您可以找到没有foreach循环的所有文档,请使用$in
您可以像下面一样使用无环

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)
  }
});

循环完成后发送响应,如下所示

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)
  }
});