【问题标题】:mongoose express counter does not increment, scope problem猫鼬快递计数器不增加,范围问题
【发布时间】:2019-12-03 22:16:00
【问题描述】:

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

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

【问题讨论】:

  • async/await 使用花哨的新东西做得很好!

标签: node.js mongodb express mongoose scope


【解决方案1】:

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

【讨论】:

  • 有几种方法可以解决这个问题。您可以为其中一个编写更有效的 mongo 查询。然而,一个更简单更重要的概念是如何use promises
  • 谢谢。我会试试。我你知道什么是最好的方法然后告诉我......
  • 你当然应该研究 Promise,因为它们是 Javascript 开发的一个非常基础的部分。
  • 问题是它不知道如何处理 forEach 循环
  • Promise.all 可能是.map 而不是.forEach 是处理数据集合的一种方式。
【解决方案2】:

我之前也遇到过类似的问题,我是这样解决的。

            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 => {

【讨论】:

  • 对不起@TobiasK 我的错我忽略了你在循环中进行了另一个数据库调用。我更新了我的答案。
猜你喜欢
  • 2021-04-12
  • 2021-04-11
  • 2020-10-23
  • 2018-05-25
  • 2011-08-28
  • 2018-07-01
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多