Javascript ExpressJs等待MongoDB获取数据并在输出之前循环

Javascript ExpressJs等待MongoDB获取数据并在输出之前循环,javascript,node.js,mongodb,express,promise,Javascript,Node.js,Mongodb,Express,Promise,我很难理解这一点,我有一个来自MongoDB(集合)的表用于评论,另一个用于用户的集合 页面加载时,它会查找注释集合并选择相关注释,然后搜索用户表以查找发表注释的用户的姓名,数据将被合并,然后发送响应 但是,输出是在从用户表中提取并添加数据之前发送的。我怎样才能解决这个问题,这是我的代码 var output = [] const Comments = require('comments.js') const Users = require('users.js') functi

我很难理解这一点,我有一个来自MongoDB(集合)的表用于评论,另一个用于用户的集合

页面加载时,它会查找注释集合并选择相关注释,然后搜索用户表以查找发表注释的用户的姓名,数据将被合并,然后发送响应

但是,输出是在从用户表中提取并添加数据之前发送的。我怎样才能解决这个问题,这是我的代码

  var output = []
  const Comments = require('comments.js')
  const Users = require('users.js')

  function delay( ) {
    return new Promise(resolve => setTimeout(resolve, 300))
  }

  async function delayedProcess(item) {
    await delay()
    Users.findById(item.user, async function(err, result) {
      Object.assign(item, {name: result.name})
      output.push(item)
    })
  }

  async function processArray(array) {
    const promises = array.map(delayedProcess)
    await Promise.all(promises)
    return res.json({data: output})
  }


  Comments.find({page_id: id}).sort({post_date:-1}).limit(6).then(function(data) {
    processArray(data)
  })

您没有从
delayedProcess
函数返回
promise

好了:-

  const Comments = require('comments.js')
  const Users = require('users.js')

  const output = []
  function delayedProcess(item) {
    return new Promise((resolve, reject) => {
      Users.findById(item.user, function(err, result) {
        if (err) return reject (err);
        output.push({ ...item, name: result.name })
        return resolve()
      })
    })
  }

  async function processArray(array) {
    const promises = array.map(async(item) => {
      await delayedProcess(item)
    })
    await Promise.all(promises)
    return res.json({ data: output })
  }

  const data = await Comments.find({ page_id: id }).sort({ post_date: -1 }).limit(6)
  processArray(data)
但是,您将始终获得连接的数组。因此,将其作为全局变量,将其作为局部变量

  function delayedProcess(item) {
    return new Promise((resolve, reject) => {
      Users.findById(item.user, function(err, result) {
        if (err) return reject (err);
        return resolve({ ...item, name: result.name })
      })
    })
  }

  async function processArray(array) {
    const output = []
    const promises = array.map(async(item) => {
      const it = await delayedProcess(item)
      output.push(it)
    })
    await Promise.all(promises)
    return res.json({ data: output })
  }

  const data = await Comments.find({ page_id: id }).sort({ post_date: -1 }).limit(6)
  processArray(data)
更简化:-因为mongodb查询本身返回承诺,所以不需要使用
新承诺
语法

  async function processArray() {
    const array = await Comments.find({ page_id: id }).sort({ post_date: -1 }).limit(6)
    const output = []
    const promises = array.map(async(item) => {
      const it = await Users.findById(item.user).lean()
      item.name = it.name
      output.push(item)
    })
    await Promise.all(promises)
    return res.json({ data: output })
  }

什么是精益函数,我找不到引用mongoose返回mongoose对象,
lean()
用于将其转换为普通对象。感谢您的回复,您救了我的命,我发现这
承诺
有点难以理解,我确信我不是一个人