Asyn c / жду с NodeJS + пн goose не ждет - PullRequest
0 голосов
/ 20 апреля 2020

Невозможно настроить функции asyn c / await для правильной работы в приложении для карточных игр.

(a) Я получаю ответ 201 без данных.

(b) Кажется, что документ колоды создается потом, с полем игроков пустой массив, указывающий, что это сделано после того, как колода сохранена в mongoDB

Ниже приведен мой код. Любая помощь приветствуется.

маршрутизатор. js

router.post('/game', (req, res, next) => {
  try {
    const { cards, playerNames, attributes } = req.body;

    const newDeck = deck.start(cards, playerNames, attributes);
    res.status(201).send(newDeck);
  } catch (err) {
    next(err);
  };
});

/ услуги / колода. js

 exports.start = async (cards, playerNames, attributes) => {
  try {
    const users = await user.create(playerNames);

    const deck = new Deck({
      cards,
      attributes,
      players: users
    });

    return await deck.save((err, newDeck) => {
      if (err) console.log(err);
      console.log('RESULT', newDeck);
    });
  } catch (err) {
    console.log(err);
  }
};

/ services / user. js

exports.create = async (users) => {
  if (users.constructor === String) {
    const user = new User({displayname: users});

    return await user.save((err, newUser) => {
      if (err) console.log(err);
      console.log('NEW USERS ', user);

      return newUser;
    });
  } else if (users.constructor === Array) {
    let userList = [];

    await users.forEach(name => {
      const user = new User({displayname: name.toString()});

      return user.save((err, newUser) => {
        if (err) {
          console.log(err);
        } else {
          userList.push(newUser);
          return newUser;
        }
      });
    });
    console.log('NEW USERS ', userList);

    return userList;
  };
};

1 Ответ

0 голосов
/ 21 апреля 2020

Я не знаю, как вы справляетесь с обещаниями,

, но forEach не является promise-aware, именно так оно и было разработано, поэтому он не будет правильно обрабатывать ваш код asynchronous

замените его на обычный for l oop или for-of l oop и добавьте ключевое слово await перед user.save() методом

...