Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js mongoose express计数器不增加,范围问题_Node.js_Mongodb_Express_Mongoose_Scope - Fatal编程技术网

Node.js mongoose express计数器不增加,范围问题

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

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

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之前o
findOne
实际上返回了一个值;在递增发生之前。

有几种方法可以解决这个问题。你可以为其中一种方法编写更高效的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调用。我更新了我的答案。