2012-01-11 6 views
78

私は継続的に実行するつもりのないスクリプトでmongooseを使用していますが、私は非常に単純な問題であるように見えますが、単純にmongoose関数への呼び出しを行い、mongodbにnodejsインスタンスが停止しないようにしたら、Ctrl + cまたはProgram.exit()で手動でkillする必要があります。完了したらmongooseの接続を正しく終了してください

コードはおおよそ次のようになります。

var mongoose = require('mongoose'); 

// if my program ends after this line, it shuts down as expected, my guess is that the connection is not really done here but only on the first real request ? 
mongoose.connect('mongodb://localhost:27017/somedb'); 

// define some models 

// if I include this line for example, node never stop afterwards 
var MyModel = mongoose.model('MyModel', MySchema); 

I)は、(mongoose.disconnectへの呼び出しを追加しようとしたんが、何をもたらすと。それを除けば、すべてがうまくいく(見つける、保存する、...)。

これは悲しげに、彼はどんな答えを受け取っていない、この人と全く同じ問題です:https://groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

おかげ

編集:それは技術的に正確であるとして、以下の答えを受け入れたが、誰もが今までにこれをヒットした場合mongooseおよび/またはmongodbドライバは、依然としてクエリが実行されているかどうかを尋ねるときに実際に接続を閉じることはないようです。

切断呼び出しをまったく覚えていなくても、クエリの実行が終了するとそれは実行されません。例外がスローされたり、並べ替えられたりすることなく呼び出しを破棄し、実際には接続を閉じることはありません。

これがあります:実際に動作させたい場合は、disconnect()を呼び出す前にすべてのクエリが処理されていることを確認してください。

+0

モデルをインポートするだけでこれを行う方法はありますか?以下の回答はどちらも動作しません:\ – Antoine

答えて

128

あなたは他の答えは私のために動作しませんでした

mongoose.connection.close() 
+14

これは実際に接続を閉じます。しかし、この呼び出しは私のデータベースの内容をクリアしていました。 mongoose.disconnect()に切り替えると、すべて正常に動作し、モカテストが正常に動作するようになりました。 –

+1

これは私のために働いていました。私はちょうど私がこれを正しいコールバックに入れたかどうかを確認する必要がありました。そうしないと、データベースに保存する前に接続を終了している可能性がありました。公正であるために、私はまだローカルdbに接続し、簡単なサンプルのユーザーオブジェクトを保存する単純なスクリプトを使用しています。 user.save()のコールバックでmongoose.connection.close()を呼び出します。 – FateNuller

+0

ご覧のとおり、これらの回答は古いです。 _Mongoose 5.0.4_を使用している場合、[Connection.close()メソッド](http://mongoosejs.com/docs/api.html#connection_Connection-close)のみがエクスポートされ、利用できるので、それを使用してください。 –

40

との接続を閉じることができます。 this answerに記載の通りmongoose.disconnect();を使用しなければなりませんでした。あなたが完了したら、それを外して、変数への接続を設定することができ

+0

これは、テスト環境を解体する場合にも好まれます。 –

+0

mongoose.disconnect()の方が使いやすく、論理的なアプローチです。 –

8

var db = mongoose.connect('mongodb://localhost:27017/somedb'); 

// Do some stuff 

db.disconnect(); 
+0

私の状況(Jestの中のMongooseのテスト)では、これは唯一の解決策です。 –

+0

私はforループ内でMongooseを使ってModel.update(..)を行います。更新のたびに接続を閉じる必要がありますか?私のサーバは多くのアップデートを処理しなければならず、しばらくしてから作業を中止しました。 – Pille

+0

以下同じ回答 – DanFromGermany

1

私はバージョン4.4.2を使用していますし、他の回答のどれも私のために働いていません。しかし、useMongoClientをオプションに追加し、closeを呼び出す変数に入れても動作するように見えました。

var db = mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: true }) 

//do stuff 

db.close() 
関連する問題