Promise.all返回双精度数组

时间:2018-08-27 21:58:43

标签: javascript node.js reactjs express

在我的节点路由器中,我具有以下内容:

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 } ] ]

1 个答案:

答案 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引起的。