Promise.all возвращает двойной массив - PullRequest
0 голосов
/ 28 августа 2018

В моем узле Router у меня есть следующее:

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

I

1 Ответ

0 голосов
/ 28 августа 2018

Похоже на данные MongoDB. И если BaseUser.find() использует MongoDB db.collection.find(), то он возвращает курсор (следовательно, я думаю, что преобразование в массив на этом уровне).

Если baseId предназначен для того, чтобы быть уникальным (то есть вы ожидаете не более одного результата), вы можете использовать db.collection.findOne() вместо.

Тем не менее, я не понимаю, почему вы заверните

basefetches.push(BaseUser.find({ baseId: req.params.id }));

в цикле над bases, поскольку bases вообще не используется в цикле. Похоже, вы просто повторяете один и тот же запрос, и в результате получаете столько же bases, сколько вы получили.

В любом случае: один массив из-за find(), а другой из-за обещания-косой черты-над-bases.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...