【发布时间】: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