2011-12-11 10 views
2

[編集]:私はこれを使って、非常に具体的な再現可能な例を用いてこの問題を更新しました。なぜこの単純なMongoose.jsプログラムは、「入れ子にされた」保存中にフリーズしますか?

これは私のプログラム全体です。

私は、2つのオブジェクトabを行い、それぞれのコレクションABで2つのスキーマASchemaBSchemaを作成し、順次それらを保存しよう - bその後、つまり、最初のa

mongoose = require('mongoose'), 
    Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/test'); 

ASchema = new Schema({ 
    text: String 
}); 

BSchema = new Schema({ 
    val: Number 
}); 

A = mongoose.model('A', ASchema); 
B = mongoose.model('B', BSchema); 

a = new A({text: 'this is a'}); 
b = new B({val: 5}); 

a.save(function(err) { 
    if(err) console.log(err.message); 
    else { 
     console.log('saved a : ', a); 
     b.save(function(err) { 
      if(err) console.log(err.message); 
      else { 
       console.log('saved b : ', b); 
      } 
     }); 
    } 
}); 

mongoose.disconnect(); 
私は起こるはず期待して何


それは文書Bに続いて、文書Aに続いてsaved a :を印刷し、その後saved b :必要があります。

実際に何が起こるか:
それはsaved a : { text: 'this is a', _id: 4ee4cab00d2c35fc04000001 }と何も印刷しません。プログラムは停止しません。それは「固まった」ままです。
mongoシェルを見て、コレクションasa、それは大丈夫です)が作成されており、その中に保存された文書がdb.as.find()で表示されています。しかし、私はコレクションbsを見つけることができません。
微調整
abの場所(保存の順番を)スワップ省コードで

は、bが保存されるようになり、そしてaは保存されないように。したがって、問題は具体的にaまたはbではありません。

質問:なぜ次の文書を保存しないのですか?

+0

のベストプラクティスのためのリンクを参照してください。エラーが完全にOKに見えた、このコードからではないようです。私は代理人またはそのような何かに間違いがあるかもしれないと思う。あなたconsole.logできますか? – alessioalex

+0

人/エージェントに問題はありません。なぜなら、コード内の場所を入れ替えても同じ効果が生じます。つまり、「内側」のものを保存するときに常にハングします。 –

+0

もっと一般的な例を編集し、誰でもテストすることができます。 –

答えて

5

答えは非常にシンプルな、あなたの最後の行を見て:

mongoose.disconnect(); 

が処理される必要があるクエリが残っていると、あなたがたときに知らないので、あなたは、それを行うべきではありません(中私たちの場合は2番目のクエリです)。つまり、最初のクエリが実行され、Mongooseが接続を切断し、2番目のクエリがハングします。

ソリューションは、最後のクエリが実行されます後mongoose.disconnect();を入れて上の最後の行を削除します。

+0

ありがとう!私は完全にそこにラインがあったことを忘れていた –

+0

問題ない、うれしい私は助けることができた! – alessioalex

0
mongoose.disconnect(); //Do not do this as async methods keep running in background. 

すべてのクエリで接続を開いたり閉じたりしないでください。

接続を一度開いて再使用してください。

私は、以下の方法を好む行います

MongoDBconObj.open(function(err, db) { 
    //re-use db 
    // All your application codes goes here... 
    //.. 
    http.createServer(onRequest).listen(8080); 
    console.log("HTTP is listening on 127.0.0.1:8080 "); 
    }); 

https://groups.google.com/forum/#!topic/node-mongodb-native/5cPt84TUsVg

関連する問題