Hành vi của Node.js là không đồng bộ, lập trình viên phải viết mã xem xét hành vi này. Sử dụng lệnh gọi lại hoặc lời hứa hoặc thư viện điều khiển luồng. Trong chương trình của bạn, bạn đã đặt truy vấn mongo bên trong vòng lặp, đây là một cách tiếp cận truy vấn không tốt. Thay vào đó, nếu truy vấn nhiều lần, hãy sử dụng toán tử $ in. Nó sẽ tối ưu hóa hiệu suất mã của bạn và cũng giải quyết vấn đề gửi phản hồi của bạn.
var resultSet = [];
db.get('busstopcollection').find({id_bus_stop: parseInt(req.body.busstopid)}, function(e, docs){
if(e || docs.length === 0) {
console.log("Sorry, wrong id.");
return e;
}
var bus_ids = [];
for(var m=0; m<docs.length; m++){
var auxRes = {};
auxRes.id_bus = docs[m].id_bus;
bus_ids.push(parseInt(docs[m].id_bus)); // collect all ids
auxRes.id_bus_stop = docs[m].id_bus_stop;
auxRes.coord_x = docs[m].coord_x;
auxRes.coord_y = docs[m].coord_y;
auxRes.id_bus_variation = docs[m].id_bus_variation;
resultSet.push(auxRes);
}
// Query at one time for all document
db.get('buscollection').find({id_bus: {$in : bus_ids}}).toArray( function(e, busDocs){
// Now find and merge in one go
busDocs.forEach(function(eachBusDoc){
for(var i=0,len = resultSet.length;i< len;i++){
if(resultSet[i].id_bus == busDocs.id_bus ){
resultSet[i].s_origin_description = eachBusDoc.s_origin_description;
resultSet[i].s_destination_description = eachBusDoc.id_destination_description;
}
}
});
res.send(JSON.stringify(resultSet));
});
});