首页 > 解决方案 > 在返回 JSON 对象之前在 MongoDB(猫鼬)中进行多个查询

问题描述

我有一个 MERN 应用程序。我与用户和组织之间存在一对多多对多的关系。我正在尝试创建一个返回用户所属的所有组织的函数。

在我的路线文件夹中,我有

export const getOrganizations = async (req, res) => {
  try {
    const currentUser = await User.findById(req.user.id)
    
    let organizations = [];
    await currentUser.organizationIds.forEach(async orgId => {
      let organization = await Organization.findById(orgId);
      console.log(organization)
      organizations.push(organization);
    })
    console.log("ORGS")

    res.status(200).json(organizations);
  } catch (error) {
    console.log(error);
    return res.status(500).json({
      message: error.message
    });
  }
}

我认为解决方案是使用等待和异步,因为现在我的控制台正在记录“ORGS”并在我的 forEach 日志中的组织之前发送响应。但我不确定如何解决这个问题。

标签: javascriptmongodbexpressmongoose

解决方案


问题在于 forEach 函数的异步回调。改用 for 循环,您可以在其中使用 await 而无需跳过等待异步代码。前任:

for(let i = 0; i < currentUser.organizationIds.length; i++) {
   let organization = await Organization.findById(currentUser.organizationIds[i]);
   console.log(organization)
   organizations.push(organization);
}

或者您可以使用 map 函数并将所有承诺存储在一个数组中,然后使用Promise.all等待所有承诺完成。前任。:

const fetchOrg = async orgId => {
  let organization = await Organization.findById(orgId);
  console.log(organization)
  organizations.push(organization);
}
let promises = currentUser.organizationIds.map(orgId => fetchOrg(orgId))
await Promise.all(promises);

推荐阅读