2017-02-26 20 views
0

MongoDBへの呼び出しからデータを取得できません。 私はコンソールに結果を表示することができますが、呼び出しの外で自分のプログラムで使用できるようにこれらの結果を外部の配列に書き込み/コピーしようとすると、何も得られません。 私が見たすべての例は、接続ループ内のすべての作業を行います。結果が配列(グローバルまたは渡された配列)にコピーされ、接続が終了し、プログラムが外部配列の処理を続行する例は見つかりません。MongoDBの呼び出しからデータを取得する

サンプルコードのほとんどは、あまりにも単純すぎる(つまり、接続ループ内のconsole.logのみ)か、あまりにも複雑で、エクスプレスAPIルートを作成する方法の例があります。私は旧式のシリアルバッチ処理をしているので、これは必要ありません。 私はMongoが非同期に構築されていることを理解していますが、まだそれを使用できるはずです。

MongoClient.connect('mongodb://localhost:27017/Lessons', function (err, db) { 
    assert.equal(err, null); 
    console.log("Connectied to the 'Lessons' database"); 
    var collection = db.collection('students'); 
    collection.find().limit(10).toArray(function(err, docs) { 
     // console.log(docs); 
     array = docs.slice(0); //Cloning array 
     console.log(array); 
     db.close(); 
    }); 
}); 
console.log('database is closed'); 
console.log(array); 

ループが終了する前にデータを記録しようとしているようです。しかし、どのようにタイミングを同期させるのですか? もし誰かが私にこのことを説明できたら、私は数日間この事を見つめていて本当にばかげているように感謝しています。

答えて

0

あなたが共有しているコードから、最後にconsole.logに配列を表示しますか?これは、2つのconsole.logがデータベースへのクエリが完了する前に実行されるため、現在のセットアップでは機能しません。

結果をコールバック機能で取得する必要があります。それらが何であるか分からなければ、どこでもmongo/nodeとしてそれらを使用する必要があります。基本的にjavascriptは本当に速く動くように設計されており、次のコード行に行く前に何かを待つことはありません。私が最初に学んでいたとき

このチュートリアルでは、私をたくさん助けた:https://zellwk.com/blog/crud-express-mongodb/

あなたは私たちはあなたがこのMongoの要求を実行しているどのような環境を知らせてもらえますか?今、私はあなたがどのようにmongoを使用しているのか分からないので、より多くの文脈を与えるでしょう。

0

お返事ありがとうございます。

環境はmongodのインスタンスをバックグラウンドで実行しているため、localhostに接続しています。私が作成したデータベースを使用していますが、コレクションを使用してサンプルコードを実行できます。

私はそれがタイミングのものだと思ったと言いました。あなたの観察は、 "2つのconsole.logがデータベースのクエリが完了する前に実行される"というメッセージが本当に私の問題を明確にしました。

Iは、終了時にコードを置換接続した後()次のコードで:

function waitasecond(){ 
    console.log(array); 
} 
setTimeout(waitasecond, 2000); 

、アレイが完全に取り込まれます。これは、少なくとも私がやりたいやり方で、私がやろうとしていたことは不可能であることを示唆しています。私は2つの選択肢があると思う。

  1. 逐次処理(元々はコンシュー) - 私はdbコールを開始する前に何らかの時間遅延を入れなければならなかったでしょう。

  2. 処理が必要なすべてのコードで関数を作成し、データベースがデータを返すときにデータベースコールバックから呼び出す必要があります。

最初のオプションは少し臭いです。私は生産でそれを見たくないので、私は第二の選択肢をとると思います。

おすすめのリンクありがとうございます。私はすぐに見ましたが、問題は、これは、応答するためにルータの呼び出しを急速に聞くことに依存する非常に一般的なパターンを記述しているということです。私がやっている処理は、ルータコールとは関係ありません。

ああ、同期のioの良い昔のために。

+0

オプション2の正しい軌道に乗っています。あなたの躊躇はオプション1が間違いなく正しいです。 – JohnnyHK

関連する問題