在我的节点路由器中,我具有以下内容:
router.get("/single-base/:id", (req, res) => {
Base.find({ _id: req.params.id })
.then(bases => {
let basefetches = [];
for (let base of bases) {
basefetches.push(BaseUser.find({ baseId: req.params.id }));
}
return Promise.all(basefetches).then(users =>
res.json(users.map(user => user.serialize()))
);
})
.catch(err => {
console.error(err);
res.status(500).json({ message: "Internal server error" });
});
});
在控制台记录return Promise.all(basefetches).then(users => console.log(users))
时,我收到:
[ [ { created: 2018-08-27T21:37:42.151Z,
_id: 5b846f268cb4481264298f82,
userId: 'tester2',
baseId: 5b81528e1314da25bc498085,
acceptedMembership: false,
isCreator: false,
__v: 0 } ] ]
我在另一个地方有完全相同的方法,它只返回一个空数组(该数组开头也应该为空)。
为什么/何时/如何将一个数组推入另一个数组,如何解决这个问题,以使users.map
不会抛出:
TypeError: Cannot read property 'push' of undefined
at Base.find.then.bases
编辑:我认为这与BaseUser.find({})
方法有关。控制台记录时:Promise.all(basefetches).then(users => console.log(users));
,我得到以下信息:
{ created: 2018-08-25T12:43:02.640Z,
_id: 5b81528e1314da25bc498085,
creatorId: 5b7efd4db3036a13601ad8d7,
title: 'testBase1',
__v: 0 }
[ [ { created: 2018-08-27T21:37:42.151Z,
_id: 5b846f268cb4481264298f82,
userId: 'tester2',
baseId: 5b81528e1314da25bc498085,
acceptedMembership: false,
isCreator: false,
__v: 0 } ] ]
我
答案 0 :(得分:0)
看起来像MongoDB数据。而且,如果BaseUser.find()
使用MongoDB's db.collection.find()
,则它会返回一个游标(因此,我认为在此级别上转换为数组)。
如果baseId
是唯一的(即,您最多期望一个结果),则可能要使用db.collection.findOne()
。
但是,我不明白你为什么要包裹
在
basefetches.push(BaseUser.find({ baseId: req.params.id }));
bases
的循环中,因为在循环中根本没有使用bases
。似乎您只是重复进行完全相同的查询,对得到的bases
产生了完全相同的结果。
无论如何:一个数组是由于find()
引起的,而另一个则是由于promises-slash-loop-over-bases
引起的。