0
mongoDBからデータをフェッチし、それらをコールバック関数外の配列形式のボットに格納しようとしています。Node.jsを使用して配列変数を空白にしています。私は以下のコードを説明しています。ここでNode.jsとMongoDBを使用してデータの配列を取得できません
exports.getCardDetails=function(req,res){
var userid=req.body.userid;
var token_id=req.body.token_id;
var userData=[];
db.f_user_login.find({_id: mongoJs.ObjectId(userid),token:token_id},function(err,doc){
if (doc.length > 0) {
db.f_card_details.find({userid:userid},function(errs,docs){
if (!errs) {
if (docs) {
for (var i = 0;i< docs.length;i++) {
var oemail=docs[i].email;
var id=docs[i]._id;
var name=docs[i].name;
var company=docs[i].company;
var position=docs[i].position;
var mobile=docs[i].mobile;
var landline=docs[i].landline;
var url=docs[i].url;
var postcode=docs[i].postcode;
var address=docs[i].address;
var isCurrentUser=docs[i].isCurrentUser;
db.f_user_profile.find({email:oemail},function(errs1,docs1){
if (!errs1) {
if (docs1) {
for(var j=0;j < docs1.length;j++){
var profileText=docs1[j].profiletext;
var biography=docs1[j].biography;
var image=docs1[j].file;
var profileid=docs1[j]._id;
}
var data={"id":id,"name":name,"company":company,"position":position,"mobile":mobile,"email":oemail,"landline":landline,"url":url,"postcode":postcode,"address":address,"profileText":profileText,"biography":biography,"image":image,"isCurrentUser":isCurrentUser,"profile_id":profileid};
userData.push(data);
}
}
})
}
console.log('user',userData);
var sdata={"statusCode": 200,"data":userData ,"message": "Your card details has been fetched successfully"};
res.send(sdata);
}
}
})
}else{
var data={"statusCode": 404,"error": "Not Found","message":"Invalid User"};
res.send(data);
}
})
}
私はuserData
配列にすべてのデータをプッシュし、応答としてではなく、ここで私の問題は、ループ内のすべてのデータがその配列にプッシュされているが、応答として、それらのデータを送信中にconsole.log('user',userData);
が空白表示されるものを送信しようとしています。私はそれらのデータを応答として送る必要があります。
これは私の目を燃やしています。そのクエリを簡略化する方法が必要です。あなたはリファクタリング中にあなたの問題を見つけて、この機能を見なければならないかもしれない次の人を救う機会があります。 – axlj
ヒント:これは非同期コールバックの問題です。上記のループが終了する(または開始する)前に 'res.send(sdata)'を呼び出しています。 – axlj
はい、私はsettimeout関数を使ってそれを解決しました。 – satya