Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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 X次异步mongo查询未运行后的回调。_Node.js_Mongodb_Async.js - Fatal编程技术网

Node.js X次异步mongo查询未运行后的回调。

Node.js X次异步mongo查询未运行后的回调。,node.js,mongodb,async.js,Node.js,Mongodb,Async.js,由于某种原因,从未触发对此的回调。有2条消息,正确地说,输出为: 10 12 12 20 20 26 26 然后,当回调运行时,应该输出30,但回调从未运行过 代码: app.get("/getMessages", function (req, res) { var JSONtoSend = [];

由于某种原因,从未触发对此的回调。有2条消息,正确地说,输出为:

10
12
12
20
20
26
26
然后,当回调运行时,应该输出
30
,但回调从未运行过

代码

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
});   

您缺少迭代器的回调函数。如果查看文档(),则在参数列表下,
的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:

迭代器(项,回调)-应用于 数组。迭代器被传递一个必须调用的回调(err) 一旦完成。如果没有发生错误,则应执行回调 不带参数或使用显式空参数运行

async只会在所有迭代器函数完成后运行最终回调,而调用迭代器回调是async跟踪完成了多少函数的方式

请尝试以下操作:

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message, callback) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                    callback();
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
}); 

理想情况下,如果迭代器缺少一个回调函数,您还可以将任何可能的错误传递给
callback()
。如果查看文档(),则在参数列表下,
的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:

迭代器(项,回调)-应用于 数组。迭代器被传递一个必须调用的回调(err) 一旦完成。如果没有发生错误,则应执行回调 不带参数或使用显式空参数运行

async只会在所有迭代器函数完成后运行最终回调,而调用迭代器回调是async跟踪完成了多少函数的方式

请尝试以下操作:

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message, callback) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                    callback();
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
}); 

理想情况下,如果迭代器缺少一个回调函数,您还可以将任何可能的错误传递给
callback()
。如果查看文档(),则在参数列表下,
的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:

迭代器(项,回调)-应用于 数组。迭代器被传递一个必须调用的回调(err) 一旦完成。如果没有发生错误,则应执行回调 不带参数或使用显式空参数运行

async只会在所有迭代器函数完成后运行最终回调,而调用迭代器回调是async跟踪完成了多少函数的方式

请尝试以下操作:

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message, callback) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                    callback();
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
}); 

理想情况下,如果迭代器缺少一个回调函数,您还可以将任何可能的错误传递给
callback()
。如果查看文档(),则在参数列表下,
的第二个参数(迭代器)将同时接收消息和回调。以下是摘录:

迭代器(项,回调)-应用于 数组。迭代器被传递一个必须调用的回调(err) 一旦完成。如果没有发生错误,则应执行回调 不带参数或使用显式空参数运行

async只会在所有迭代器函数完成后运行最终回调,而调用迭代器回调是async跟踪完成了多少函数的方式

请尝试以下操作:

app.get("/getMessages", function (req, res) {                                        
    var JSONtoSend = [];                                                             
    getAllMessages(req.session.cur_user, function ( messages ) {                     
        console.log("10");                                                           
        async.each(messages, function (message, callback) {                                    
            console.log("12");                                                       
            User.findById(message.senderId, function (sender) {                      
                console.log("20");                                                   
                User.findById(message.recieverId, function (reciever) {              
                    console.log("26");                                               
                    JSONtoSend.push({ content:message.content, reciever: reciever, sender: sender });
                    callback();
                });                                                                  
            });                                                                      
        }, function (err) { // this is the callback                                  
            if (err) {                                                               
                console.log(err);                                                    
            } else {                                                                                                                                                        
                console.log("30");                                                   
                res.json(JSONtoSend);                                                
            }                                                                        
        });                                                                          
    });                                                                              
}); 

理想情况下,您还可以将任何可能的错误传递给
callback()

啊,我理解。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢啊,我明白了。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢啊,我明白了。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢啊,我明白了。我被有两个回调的事实弄糊涂了:每个项目一个回调,整个项目一个回调。谢谢