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