返回 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 , Promise , Promise ] 奇怪。在考虑之后,似乎地图功能已经正确地完成了它的工作,但它返回承诺......我已经进行了编辑。现在的输出是什么? 我对你轻轻建议我的代码进行了所有更改,但我仍然得到 [ Promise , Promise , Promise ] 我调试并编辑过,这里是代码!当然,你应该删除和替换仿真函数,他们在这里只是为了演示用SO代码sn-p。

以上是关于返回 2 个“同步”嵌套查询(Express、Mongoose)的响应的主要内容,如果未能解决你的问题,请参考以下文章

返回根据嵌套对象过滤的 BigQuery 数据

node.js,express - 在循环中以同步方式一个接一个地执行mysql查询

MongoDB - 查询计算数组中的嵌套文档

Entity Framework Core:如何将 2 个 COUNT 查询合并为一个

express 中的嵌套 api 端点

GraphQL 突变为嵌套响应返回 null