【发布时间】: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