Node.js mongoose express计数器不增加,范围问题
返回的计数器值始终为0。为什么?我怎样才能解决这个问题? 在messages.findOne中,输入正确的计数器值。在conversation.forEach中,计数器值始终为空Node.js mongoose express计数器不增加,范围问题,node.js,mongodb,express,mongoose,scope,Node.js,Mongodb,Express,Mongoose,Scope,返回的计数器值始终为0。为什么?我怎样才能解决这个问题? 在messages.findOne中,输入正确的计数器值。在conversation.forEach中,计数器值始终为空 router.get('/isNewMessages',auth,async(req,res)=>{ 试一试{ const query={usernames:req.user.username} 查找(查询,(错误,对话)=>{ var counterNewMessages=0 conversations.forEac
router.get('/isNewMessages',auth,async(req,res)=>{
试一试{
const query={usernames:req.user.username}
查找(查询,(错误,对话)=>{
var counterNewMessages=0
conversations.forEach(conversation=>{
console.log(counterNewMessages)//此处始终为0
Messages.findOne({u id:conversation.Messages},(err,Messages)=>{
counterNewMessages+=messages.messages.filter(message=>!message.isRead&&message.receiver==req.user.username)。长度
console.log(counterNewMessages)//这里的值是正确的
})
})
res.status(201).send({counterNewMessages})
})
}捕获(e){
资源状态(400).发送(e)
}
})
解决方案(接受答案中的解释):
router.get('/isNewMessages',auth,async(req,res)=>{
试一试{
const query={usernames:req.user.username}
查找(查询,异步(错误,对话)=>{
让counterNewMessages=0
for(const对话中的对话){
等待消息。findOne({u id:conversation.Messages},(err,Messages)=>{
counterNewMessages+=messages.messages.filter(message=>!message.isRead&&message.receiver==req.user.username)。长度
})
}
res.status(201).send({counterNewMessages})
})
}捕获(e){
资源状态(400).发送(e)
}
})
我以前也遇到过类似的问题,下面是我如何解决的
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 => {
const-roomPromises=[];
tourPackagesParams.roomPax.forEach(房间=>{
如果(
) {
roomPromises.push(fetchHotelRoomByRoomId(room.roomId));
}否则{
roomPromises.push(Promise.resolve(null));
}
});
const-roomUpgrades=[];
承诺。所有([…房间承诺])然后(响应=>{
我以前也遇到过类似的问题,下面是我如何解决的
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 => {
const-roomPromises=[];
tourPackagesParams.roomPax.forEach(房间=>{
如果(
) {
roomPromises.push(fetchHotelRoomByRoomId(room.roomId));
}否则{
roomPromises.push(Promise.resolve(null));
}
});
const-roomUpgrades=[];
承诺。所有([…房间承诺])然后(响应=>{
这是因为您在异步函数中递增。因此,res.send
发生在调用findOne
实际返回值之前;在递增发生之前。这是因为您在异步函数中递增。因此,res.send
发生在调用t之前ofindOne
实际上返回了一个值;在递增发生之前。有几种方法可以解决这个问题。你可以为其中一种方法编写更高效的mongo查询。但是,一个更简单、更重要的概念是如何感谢你。我会尝试一下。我知道什么是最好的方法,然后告诉我……你知道吗当然应该研究承诺,因为它们是Javascript开发的一个非常基本的部分。问题是它不知道如何处理forEach循环承诺。所有的都可能。map
而不是。forEach
将是处理数据集合的一种方法。有几种方法可以解决这个问题。您可以rite是一个更高效的mongo查询。然而,对于您来说,一个更简单、更重要的概念是如何感谢您。我会尝试一下。我知道什么是最好的方法,然后告诉我……您当然应该研究承诺,因为它们是Javascript开发的一个非常基本的部分。问题是它不知道如何处理forEach循环Promise.all
可能使用.map
而不是.forEach
将是处理数据收集的一种方法。使用async
/await
的奇特新东西做得好!使用async
/await
的奇特新东西做得好!抱歉@TobiasK my bad我忽略了你在做另一件事循环内的r db调用。我更新了我的答案。抱歉@TobiasK my bad我忽略了你在循环内进行另一个db调用。我更新了我的答案。