2017-03-27 2 views
0

노드 js와 함께 내 애플 리케이션의 백엔드를하고있다. 이 경우 페이스 북, 인스 타 그램과 같은 전형적인 대시 보드를 얻으려고 노력하고 있습니다. 한 사용자의 경우 다음과 같은 사용자를 얻으려고합니다. 그리고 내가 다음 사용자 배열을 얻을 때, 나는 그들이 가지고있는 "recetas"를 발견한다 (하나의 사용자는 둘 이상을 가질 수있다). 그리고 마지막으로 배열에이 모든 recetas를 추가하지만 문제는 그것이 나를 비어있게하는 것입니다.노드 js 배열 대시 보드

getDashboard = function (req, res) { 
    var myarray = new Array(); 
    //myarray = []; 
    User.findById(req.params.id, function (err, user) { 
    if (!user) { 
     res.send(404, 'User not found'); 
    } 
    else { 
     var a = user.following; 
     a.forEach(function (current_value) { 
     Receta.find({ "user_id": current_value._id }, function (err, recetas) { 
      if (!err) { 
      recetas.forEach(function (receta) { 
       myarray.push(receta); 
      } 
      } else { 
      console.log('Error: ' + err); 
      } 
     }); 
     }) 
     res.send(myarray); 
    } 
    }); 
}; 
+0

같은 라이브러리를 사용할 수 있습니다 (다음 번에 직접 해보세요.) forEach 뒤에 닫는')'이 없습니다. 그래서 원래'.forEach (function() {...}'닫지 않고')' –

답변

2

일반적인 비동기 문제를 다루고 있습니다. Receta.find은 비동기식이므로 차단 작업이 아니므로 Receta.find 호출이 완료되기 전에 res.send이 호출됩니다. 당신은 Promises를 사용하여이 문제를 해결하기가 노드의 버전에서 사용할 수있는 가정 할 수 있습니다 네이티브 약속을 사용할 수없는 경우

var a = user.following; 
var promises = a.map(function(current_value) { 
    return new Promise(function(resolve, reject) { 
     Receta.find({"user_id":current_value._id}, function (err, recetas) { 
      if(!err) { 
       resolve(recetas); 
      } else { 
       reject(err); 
      } 
     }); 
    }); 
}); 

Promise.all(promises).then(function(allData) { 
    res.send(allData); 
}).catch(function(error) { 
    res.send(error); 
}); 

, 당신은 형식 고정 Q 또는 bluebird

+0

에서 이렇게 보입니다. 하지만 하나의 사용자가 하나 이상의 receta를 가질 수 있기 때문에 내가 할 수있는 receta (각각의 insde에 대해 find)에서 나는 [[{obj1}, {obj2}], [{ob3 }]] 이걸 원해요 [{obj1}, {obj2}, {obj3}] –

1

res.send(myarray);는 I/O로 인해 Receta.find a.forEach 완료되기 전에 호출되고.

루프가 완료되고 recetas가 반환 될 때만 res.send를 호출하십시오.