使用NodeJS异步/等待+猫鼬不等待

时间:2020-04-20 16:28:59

标签: node.js mongodb mongoose async-await

无法在我的纸牌游戏应用中使异步/等待功能正常工作。

(a)我收到没有数据的201响应。

(b)看板文件似乎是在此之后创建的,players字段为空数组,指示在将看板文件保存到mongoDB之后完成

下面是我的代码。任何帮助表示赞赏。

router.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);
  };
});

/services/deck.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 :(得分:0)

我不熟悉您如何处理诺言,

但是forEach不是promise-aware,这是它的设计方式,因此它将无法正确处理您的asynchronous代码

用普通的for循环或for-of循环替换它,并在await方法前面添加user.save()关键字