代码之家  ›  专栏  ›  技术社区  ›  otto

mongoose express计数器不递增,范围问题

  •  0
  • otto  · 技术社区  · 6 年前

    返回的计数器值始终为0。为什么?我怎样才能解决这个问题? 在messages.findOne中有正确的计数器值。在conversation.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 回复  |  直到 6 年前
        1
  •  1
  •   Pytth    6 年前

    这是因为你在异步函数中递增。因此, res.send 在呼叫之前发生 findOne 实际上返回了一个值;在增量发生之前。

        2
  •  1
  •   junted    6 年前

    我以前也有过类似的问题,下面是我如何解决的。

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