javascript - 在返回 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 日志中的组织之前发送响应。但我不确定如何解决这个问题。
解决方案
问题在于 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);
推荐阅读
- sml - 如何遍历模式并返回所有字符串的列表
- java - 我在 openshift 服务中看不到 Docker 映像
- php - 如何修复:无法加载动态库 'C:\Program Files\php\ext\php_imagick.dll' - 在第 0 行的未知中找不到指定的模块?
- google-cloud-platform - 防止存储桶公开
- html - CSS translate 属性在 Chrome 上中断,但在 Firefox 中显示完美
- typescript - 从 Redux Toolkit 的 createSlice 获取操作类型
- kubernetes-helm - 直接从 helm 中的 values.yaml 设置 ConfigMap 值
- scala - 如何根据 Spark Scala 中其他数据帧中的多列匹配过滤数据帧
- css - 在移动设备上使用 textarea 时重叠 div
- extjs - 嵌套的卡片布局面板会触发意外的激活事件。[ExtJS]