【问题标题】:Assign keystonejs callback function data to array将keystonejs回调函数数据分配给数组
【发布时间】:2018-01-23 17:00:17
【问题描述】:

我是 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,
            }); 
        }       

    });

  }
}

如果有人可以帮助我,那就太好了:)

【问题讨论】:

  • 我发现这两个函数都有问题。你想帮助哪一个?他们甚至看起来都没有联系。
  • 您只需将mainarray.push 代码放在getAgenda 回调中。
  • @DushyantBangal 对不起,我已经更新了问题:) 是的,我尝试将 mainarray.push 放在 getAgenda 中,但随后我在回调函数之外得到了一个空数组。我需要将 agen_arr 从 getAgenda 回调中取出,有什么办法吗?
  • 唯一的方法是执行依赖于getAgenda回调中的agen_arr。对于一个干净的代码,你可以把它全部放在一个函数中,然后作为回调给出它
  • 你需要重组整个事情。您不应该在 for 循环中调用 mongo 查询并期望它们在循环结束时输出。此外,您的响应在 for 循环中。那是行不通的。

标签: node.js keystonejs


【解决方案1】:

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

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

您需要将其转换为单个查询,而不是将 mongodb 查询放在 for 循环中。只需将 _ids 放入单个数组并触发单个查询。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多