Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/40.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 链接响应的节点Js_Node.js_Mongoose_Promise - Fatal编程技术网

Node.js 链接响应的节点Js

Node.js 链接响应的节点Js,node.js,mongoose,promise,Node.js,Mongoose,Promise,我试图在循环中进行db调用,并希望将该数据添加到一个对象中,然后将该对象发送给用户,但在用户端只得到一个空对象。 我已经查过了 我希望输出如下所示:- { food : { items: [...] }, vegetable: { items: [...] } } 食物和蔬菜是从数据库调用中获取的密钥,每个密钥中的项目都是从单独的数据库调用中返回的。return res.json(data)是在解

我试图在循环中进行db调用,并希望将该数据添加到一个对象中,然后将该对象发送给用户,但在用户端只得到一个空对象。 我已经查过了

我希望输出如下所示:-

{
  food : {
           items: [...]
         },
  vegetable: {
            items: [...]
             }
}
食物和蔬菜是从数据库调用中获取的密钥,每个密钥中的项目都是从单独的数据库调用中返回的。

return res.json(data)
是在解决任何映射的产品承诺之前执行的(由于您返回的是
数据,而不是
数据,因此也有一个输入错误)。一种方法是映射
查找
-promises并在映射的数组上使用
Promise.all
。比如:

router.get('/collection', (req, res) => {
    const Data = {}

    Section.find({})
    .then(sections => {
        const sectionProductPromises = sections.map(section => {
            let id = section._id;
            return Product.find({
                    section: id
                })
                .then(products => {                     
                    Data[section.title] = {
                        title: section.title,
                        routeName: section.title,
                        id,
                        items: products
                    }
                });

        });
        return Promise.all(sectionProductPromises);    
    })
    .then(() => {
        res.json(Data)
    })
    .catch(err => {
        res.status(500).json(err)
    });
});

不,不要使用
推送
!只需
返回它,然后使用
map()
调用的结果。@Bergi:好的,我已经编辑了我的答案。谢谢你的意见!您可以直接在
map
函数上使用
promise.all
,如下所示:
promise.all(sections.map(section=>{…})
@MahdiHashemi:是的,但我还是这样说吧,因为我认为这样可读性更强。@MahdiHashemi:我想我可以回答这个问题-在创建额外数组时,使用推送会不必要地增加空间复杂度。但让我们看看Bergi是否还有另外一点:)
router.get('/collection', (req, res) => {
    const Data = {}

    Section.find({})
    .then(sections => {
        const sectionProductPromises = sections.map(section => {
            let id = section._id;
            return Product.find({
                    section: id
                })
                .then(products => {                     
                    Data[section.title] = {
                        title: section.title,
                        routeName: section.title,
                        id,
                        items: products
                    }
                });

        });
        return Promise.all(sectionProductPromises);    
    })
    .then(() => {
        res.json(Data)
    })
    .catch(err => {
        res.status(500).json(err)
    });
});