我想返回帖子数组,但我得到了一个空数组

狂犬病_alkholi

postsArr 没有得到数据

  router.get('/user-post/:id', checkJwt, (req, res, next) => {
  let postsArr = []
  db.userSchema.findOne({ _id: req.params.id })
    .populate('posts')
    .exec((err, da) => {
      for (let i = 0; i < da.posts.length; i++) {
        db.postSchema.find({ _id: da.posts[i]._id })
          .populate('comments')
          .exec((err, post) => {
            postsArr.push(post)
          })
      }
      console.log(postsArr)
    })

})
jfriend00

如果您在数据库上使用 promise 接口,这会容易得多:

router.get('/user-post/:id', checkJwt, async (req, res, next) => {
    try {
        let da = await db.userSchema.findOne({ _id: req.params.id }).populate('posts').exec();
        let postsArray = await Promise.all(da.posts.map(post => {
            return db.postSchema.find({ _id: post._id }).populate('comments').exec();
        }));
        res.json(postsArray);
    } catch (e) {
        console.log(e);
        res.sendStatus(500):
    }
});

循环中异步操作的挑战在于它们不是按顺序运行的——它们都是并行运行的。for循环刚刚起步所有的异步操作,然后你永远不知道,当他们完成所有的工作,除非你跟踪他们都弄好了。这可以通过使用计数器来跟踪每个异步结果何时完成而无需承诺即可完成,但是让Promise.all()您为您完成要容易得多它还会将所有结果按正确顺序排列。


如果您想对数据库操作进行排序并一次一个地连续运行它们,您可以这样做:

router.get('/user-post/:id', checkJwt, async (req, res, next) => {
    try {
        let da = await db.userSchema.findOne({ _id: req.params.id }).populate('posts').exec();
        let postsArray = [];
        for (let post of da.posts) {
            let result = await db.postSchema.find({ _id: post._id }).populate('comments').exec();
            postsArray.push(result);
        }
        res.json(postsArray);
    } catch (e) {
        console.log(e);
        res.sendStatus(500):
    }
});

第二个版本一次只运行一个数据库操作,顺序。它将减少数据库的峰值负载,但完成速度可能会更慢。


您会注意到使用 Promiseawait并使错误处理变得更加简单,因为所有错误都将传播到try/catch您可以记录错误并发送错误响应的相同位置。您的原始代码没有对您的数据库调用进行错误处理。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我想移动语义,但我得到了一个隐藏复制语义的通用参考

当尝试将此数组导出为php中的CSV文件时,我得到了一个空表

我试图通过迭代用整数填充数组,但我得到一个 ArrayIndexOutOfBoundsException

我有一个数组,但我想分开检查它

我想让一个按钮在 ViewPager 到达第 4 页时可见,但我得到空指针异常

我正在尝试从我的 sql 数据库获取数据到我的反应页面,但我的 api 返回一个空数组

我的搜索返回一个空数组

为什么我的函数返回一个空数组?

即使我从我的 javascript 函数返回一个数组,我也得到一个对象

Angular 返回一个未定义的数组,但我之前定义过

我想尝试一些 python 包,但我得到了这个:“reportMissingModuleSource”和“reportMissingImports”

我想指定一个数组的轴及其索引值,并返回子数组

我想根据嵌套数组中的值返回一个多维数组

虽然我使用了isset,但我得到了一个未定义的索引错误

我有一个包含单词的文本文件,我想将它们添加到数组列表中,但我遇到了问题

我将一个数组传递给 'xlsx' 以获取 Excel 文件,但是我得到了跨每一行解析的数组元素

我正在尝试使用 getElementsByClassName 选择一个画布元素,但我只能得到一个元素数组

为什么我得到一个空数组?猫鼬

从 Promise 返回的 Jest 测试 axios 错误。我得到一个“数组”

我在选择Laravel 5.6的get()中得到一个数组返回

使用$ resource.query,我想返回一个包含实际资源数组的对象

我想返回数组

我想制作一个动画极坐标图,但我得到的图表只有一个半径和一个列表

我想减去 2 个数组并得到第三个数组,它由第一个数组的剩余元素组成

Flutter 我想设计这样的界面,你们能帮我吗?我正在设计一个关于页面,但我遇到了问题

(react) 由于 .map() 函数,我得到了多个数组,如何将状态设置为一个数组?

我得到了一个包含 737511 之类的整数的数组,如何将该数组中的每个整数转换为 2020-03-27 之类的日期

我想生成一个常规数组

错误:“预期解码 Dictionary<String, Any> 但找到了一个数组。” ——但我还没有定义字典?