返回 2 个“同步”嵌套查询(Express、Mongoose)的响应
Posted
技术标签:
【中文标题】返回 2 个“同步”嵌套查询(Express、Mongoose)的响应【英文标题】:Return the response of a 2 "Synchronous" nested Queries (Express, Mongoose) 【发布时间】:2021-03-16 17:17:26 【问题描述】:我想返回一个这样的元素数组:
ApiResponse = [
_id: 1,
name: Mike,
transactions: 5,
_id: 2,
name: Jhon,
Transactions: 10
]
第一个数据 "Users" 来自对 Schema "Users" 的查询,但 "Transactions" 数字来自对其他模式 "Transactions" 的查询
我尝试了下一个逻辑:
获取所有用户使用:
使用 map 函数迭代“respUsers”数组:
对于我得到的每个“用户”,我想查询与之相关的所有交易:
那么我只想要数组的“长度”:
最后,我希望 map 函数返回一个对象数组,例如:
完成 api 控制器的下一个完整代码:
exports.list = async (req, res) =>
//Find all users
const respUsers = await User.find().exec();
const responseArray = respUsers.map(async (user) =>
let transactions = await Transactions.find(
doctorOwner: user._id,
).exec();
let transactionsLength = await transactions.length;
return
_id: user._id,
name: user.name,
transactions: transactionsLength
;
);
console.log(responseArray);
res.json(responseArray);
;
但我有 3 个空数组 [],[],[]
如果我在服务器端 console.log 我得到:
[ Promise <pending> , Promise <pending> , Promise <pending> ]
我该怎么做?
【问题讨论】:
尝试这样的事情,让 responseArray = await respUsers.map(async (promise, user) => await promise; //在这里做你的逻辑 .Promise.resolve()); 对不起不起作用:( 【参考方案1】:此代码有效。大约是Promise.all()
。它创建了一个 Promise,当内部的所有其他 Promise 都已解决时,该 Promise 将被解决。
// Emulates User.find().exec()
async function getUsers()
return Promise.resolve([
_id: "id1",
name: "John",
,
_id: "id2",
name: "Johny",
,
_id: "id3",
name: "Jonas",
,
]);
// Emulates Transactions.find( doctorOwner: user._id )
async function getTransactions()
const arr = [];
for (let i = 0; i < Math.round(Math.random() * 100); i++)
arr.push("transaction");
return Promise.resolve(arr);
const superFunc = async (req, res) =>
// Find all users
let respUsers = await getUsers();
const responseArray = Promise.all(
respUsers.map(async (user) =>
let transactions = await getTransactions();
let transactionsLength = transactions.length;
const toReturn =
_id: user._id,
name: user.name,
transactions: transactionsLength,
;
return toReturn;
)
);
console.log(await responseArray);
;
superFunc();
.as-console-wrapper
max-height: 100% !important;
top: 0;
【讨论】:
我添加了 await 就像你展示的那样,仍然得到 [ Promise以上是关于返回 2 个“同步”嵌套查询(Express、Mongoose)的响应的主要内容,如果未能解决你的问题,请参考以下文章
node.js,express - 在循环中以同步方式一个接一个地执行mysql查询