2017-12-06 12 views
0

多分私は何かを見落としていますが、私はかなりシンプルな設定をしています。私がしようとしているのは、自分のデータベースにあるすべての「App」ドキュメントを見つけて、各アプリケーションごとにそのアプリケーションに関連付けられたユーザードキュメントの数を取得することです。私は、コンソールログを見てみるとネストされたときにマングースカウントが機能しない?

AppObject.find({}).exec((err, apps) => { 
    if (err) { 

    } else if (!apps) { 

    } else { 
    apps.forEach((app, index) => { 

     (function (app) { 
     console.log('app ID ' + app._id); 
     User.find({ appId: app._id }).count((countErr, count) => { 
      console.log('COUNT ERR ' + JSON.stringify(countErr)); 
      console.log('Number of docs: ', count); 
      // do more things with the App and the count 
     }); 
     }(app)); 

    }); 
    } 
}); 

、私は何を見ていると、

console.log('app ID ' + app._id); 

行が正しくアプリのIDを出力しますが、その後

console.log('Number of docs: ', count); 

は0として表示されます。

私はforEachループの外でクエリを実行して(そして、手動でアプリケーションIDを提供する)正しくdocumeの数を返しますnts。

私は紛失しています。何か助けていただければ幸いです。

ありがとうございます!

答えて

0

NodeJSの行が順番に実行されていると仮定するのは間違いです。いくつかの非同期の記事は、あなたが見つける何NodeJSのイベントループにhttps://blog.risingstack.com/node-hero-async-programming-in-node-js/

を説明

チェックアウトは、最初forループが反復処理を完了した後にデータベースへの呼び出しが返されています。

+0

私は即時の関数の中でデータベースへの2番目の呼び出しを持っていますが?私はその電話が自己完結型であると思ったでしょう – Zyph

+0

私の最初の答えは間違っています。 app._idが期待しているタイプとは異なるタイプである可能性がありますか? Mongooseは、実際に表現しているフィールドを反復処理するときにJSONではないドキュメント参照を返すことがあります。私は変数にクエリを割り当て、クエリが同じであることを確認します。 – d3l33t

0

私は、最新のノードバージョン8.xで提供されているコールバックhellからAsync/AwaitにNodejを移行するプロジェクトを最近開始しました。以下の解決策を見つけて、それを試してください。ありがとうございました。

//Create a async/await function with ES6 syntax 
const findAllCount = async() => { 
try{ 
    const apps = await AppObject.find({}) 
    await apps.forEach(app, async() => { 
    console.log('app ID ' + app._id) 
    const count = await User.find({ appId: await app._id }).count() 
    console.log('Number of docs: ', count) 
    // Here you can continue to use app and count for more things 
}) 
} 
catch(error){console.error('Error at findAllCount function: '+error)} 
} 

// Invoke Function 
findAllCount() 

希望します。そうでない場合は、私の最後にシナリオを再現するコレクションスキーマを提供してください。どうもありがとうございます。

関連する問題