2017-08-08 6 views
0

少し序文:私は自分の無知ノード+ MongoDBの非同期クエリの問題に引っかかっ

私はNode.jsの中で、配列からいくつかの情報を渡すためにしようとしてい容赦下さいノードでの作業に非常に新しいです、それがMongoDB文書に存在するかどうかをチェックします。私はまだNodeの周りに頭を抱えて、データベースを非同期的に扱う方法に苦労しています。

私は上記のコードでは、次のコード

for (i in articleTitle) { 

    console.log(articleTitle[i]); 

    // Use connect method to connect to the Server 
    MongoClient.connect(mongoUrl, function(err, db) { 
     if (err) throw err; // Throw error 
     var query = { title: articleTitle[i] }; // Query Parameter 

     // Perform Query 
     db.collection(mongoCollection).find(query).toArray(function(err, result) { 
      if (err) throw err; // Throw error 
      if (result == '') { 
       console.log('No results found for title:', articleTitle[i]); 
      } else { 
       console.log('Found an entry'); 
      } 

      db.close(); // Close connection 
     }); 
    }); 
} 

を持って、私は(例えば:['Title1', 'Title2', 'Title3']articleTitleと呼ばれる文字列の配列を有していて、私は、使用(配列でこれらのタイトルのそれぞれを介して実行for()ループ)、各タイトルがデータベースに存在するかどうかを確認します。

次のように私が手出力は次のようになります。それは、配列内の最後のオブジェクトに対して3回をチェックしているように見えるの上

> Title1 
> Title2 
> Title3 
> No results found for title: Title 3 
> No results found for title: Title 3 
> No results found for title: Title 3 

明らかなように。私もasync packageを実装しようとしましたが、それにも苦労しました。

ご協力いただければ幸いです。

答えて

2

あなたが持っている問題は、コールバック関数の変数iの有効範囲です。

代わりにfor (let i in articleTitle)を使用してください。 これはすべての反復に対して新しい変数iを作成し、スコープはその反復に制限されます。

この質問への回答JavaScript closure inside loops – simple practical exampleは、これがなぜ起こるのか、JavaScriptの範囲とクロージャについて詳しく説明しています。上記の質問は、この質問の正確な複製です。

+1

これは完全に機能しました。詳しい情報をありがとう。 (回答は7分でマークされます; p) –