将keystonejs回调函数数据分配给数组

时间:2018-01-22 11:12:10

标签: node.js keystonejs

我是node.js的新手,目前正在使用keystonejs cms和MongoDB开展项目。现在我陷入了获取与多个集合相关的数据的困境。由于这个回调函数,我无法返回带有关系数据的数组。我的代码与此示例代码类似。

var getAgenda = function(id, callback){
callback = callback || function(){};
if(id){

    AgendaDay.model.find({summit:id}).exec(function (err, results3) {

        var arr_agenda = [];
        var arr_agenda_item = [];   

        for(var key3 in results3){                
            AgendaItem.model.find({agendaDay:results3[key3]._id}).exec(function  (err, results2){

                for(var key2 in results2){                        

                    arr_agenda_item.push(
                    {
                            item_id: results2[key2]._id, 
                            item_name: results2[key2].name,
                            from_time: results2[key2].time_from,   
                            to_time: results2[key2].time_to,   
                            desc: results2[key2].description, 
                            fatured: results2[key2].featured,     
                        }
                    ); 
                }   
                arr_agenda.push(
                {
                        name: results3[key3].name, 
                        date: results3[key3].date, 
                        description: results3[key3].description,
                        item_list:arr_agenda_item    
                    }
                ); 

                return callback(arr_agenda);

            });
        }
    });
  }
}

exports.list = function (req, res) {

var mainarray = [];

Summit.model.find().exec(function (err, resultssummit) {
    if (err) return res.json({ err: err });
    if (!resultssummit) return res.json('not found');

    Guest.model.find().exec(function (err, resultsguset) {

        for(var key in resultssummit){  

            var agen_arr = [];  

            for(var i=0; i<resultssummit[key].guests.length; i++){      

                var sumid = resultssummit[key]._id;

                    //this is the function im trying get data and assign to mainarray
                    getAgenda(sumid, function(arr_agenda){                  
                        agen_arr = arr_agenda;
                    });

                    mainarray.push(
                        {
                            id: resultssummit[key]._id, 
                            name: resultssummit[key].name,
                            agenda_data: agen_arr,
                        }
                    );
            }

            res.json({
                summit: mainarray,
            }); 
        }       

    });

  }
}

如果有人可以帮助我,那真的很棒:)

1 个答案:

答案 0 :(得分:0)

你需要对整个事情进行重组。您不应该在for循环中调用mongo查询并期望在循环结束时输出它们。此外,您的响应是for循环。那不行。

我会告诉你怎么做。我不能为你重构所有代码。

不是将mongodb查询放在for循环中,而是需要在单个查询中进行转换。只需将_id放在一个数组中,然后触发一个查询。

AgendaItem.model.find({agendaDay:{$in:ARRAY_OF_IDS}})

你也需要为AgendaDay.model.find({summit:id})做同样的事情。