猫鼬快递柜台不增加,范围问题

时间:2019-12-03 22:16:00

标签: node.js mongodb express mongoose scope

返回的计数器值始终为0。为什么?我怎么解决这个问题? 在messages.findOne中,有正确的计数器值。在session.forEach中,计数器值始终为空。

router.get('/isNewMessages', auth, async (req, res) => {
  try {
    const query = { usernames: req.user.username }
    Conversation.find(query, (err, conversations) => {
      var counterNewMessages = 0
      conversations.forEach(conversation => {
        console.log(counterNewMessages) // Here is always 0
        Messages.findOne({ _id: conversation.messages }, (err, messages) => {
          counterNewMessages += messages.messages.filter(message => !message.isRead && message.receiver === req.user.username).length
          console.log(counterNewMessages) // Here is value is correct
        })
      })
      res.status(201).send({ counterNewMessages })
    })
  } catch (e) {
    res.status(400).send(e)
  }
})

解决方案(已接受答案的说明):

router.get('/isNewMessages', auth, async (req, res) => {
  try {
    const query = { usernames: req.user.username }
    Conversation.find(query, async (err, conversations) => {
      let counterNewMessages = 0
      for (const conversation of conversations) {
        await Messages.findOne({ _id: conversation.messages }, (err, messages) => {
          counterNewMessages += messages.messages.filter(message => !message.isRead && message.receiver === req.user.username).length
        })
      }
      res.status(201).send({ counterNewMessages })
    })
  } catch (e) {
    res.status(400).send(e)
  }
})

2 个答案:

答案 0 :(得分:1)

我之前也有类似的问题,这是我如何解决它。

            const roomPromises = [];
            tourPackagesParams.roomPax.forEach(room => {
              if (
                <conditional statement>
              ) {
                roomPromises.push(fetchHotelRoomByRoomId(room.roomId));
              } else {
                roomPromises.push(Promise.resolve(null));
              }
            });

            const roomUpgrades = [];
            Promise.all([...roomPromises]).then(response => {

答案 1 :(得分:1)

这是因为要在异步函数中递增。因此,res.send发生在对findOne的调用实际返回值之前;在增量发生之前。