完了したら、マングースの接続を適切に閉じます


145

継続的に実行することを意図していないスクリプトでマングースを使用していますが、非常に単純な問題のように見えますが、答えを見つけることができません。mongodbにリクエストを送信する任意のmongoose関数を呼び出したら、nodejsインスタンスは停止せず、Ctrl + cまたはProgram.exit()などを使用して手動で強制終了する必要があります。

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

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);

mongoose.disconnect()への呼び出しを追加しようとしましたが、結果はありませんでした。それを除けば、すべてが正常に機能します(検索、保存など)。

これはこの人とまったく同じ問題ですが、悲しいことに彼は回答を受け取りませんでした:https : //groups.google.com/group/mongoose-orm/browse_thread/thread/c72cc1c51c76e661

ありがとう

編集:それは技術的に正しいので以下の答えを受け入れましたが、誰かがこの問題に再び遭遇した場合、クエリがまだ実行されているかどうかを尋ねると、mongooseやmongodbドライバが実際に接続を閉じていないようです。

切断呼び出しもまったく覚えていません。クエリの実行が終了すると記憶しません。例外やその他の種類の例外をスローせずに呼び出しを破棄するだけで、実際には接続を閉じません。

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


1
モデルをインポートするだけでこれを行う方法はありますか?どちらも以下の回答作業の:\
アンソニー

回答:


201

あなたはとの接続を閉じることができます

mongoose.connection.close()

25
これは実際には接続を閉じます。しかし、この呼び出しは私のデータベースの内容をクリアしていました。mongoose.disconnect()に切り替えると、すべてが適切に機能し、モカテストが再び適切に機能し始めました
Brian Noah

1
これでうまくいきました。これを正しいコールバックに配置したことを確認する必要がありました。そうでない場合、データベースに保存する前に接続を閉じている可能性があります。公平を期すために、私はまだローカルデータベースに接続し、単純なサンプルユーザーオブジェクトを保存する単純なスクリプトを使用しています。user.save()へのコールバックでは、mongoose.connection.close()を呼び出します。
FateNuller

6
ご覧のとおり、これらの回答は古いものです。あなたが使用している場合マングース5.0.4をこの方法はのみ、のみ利用可能エクスポートされているので、それを使用しています。Connection.close()
КонстантинВан

74

他の答えは私にはうまくいきませんでした。私はこの答えでmongoose.disconnect();述べたように使用しなければなりませんでした。


これは、テスト環境を破棄する場合にも推奨されます。
Matt Lo

1
mongoose.disconnect()は、論理的アプローチを使用する方が良いです。
Abdul Alim Shakir、2018年

17

変数への接続を設定し、完了したらそれを切断できます。

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

// Do some stuff

db.disconnect();

私の状況(Jest内でマングースをテスト)では、これが機能した唯一のソリューションです
コードウィスパー

forループ内でMongooseを使用してModel.update(..)を実行します。更新のたびに接続を閉じる必要がありますか?私のサーバーは多くの更新を処理する必要があり、しばらくすると動作を停止しました。
ピレ

以下と同じ答え
ダニエルW.

3

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

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

//do stuff

db.close()

1

メソッドの外部で閉じたり切断したりしようとすると、エラーが発生します。最善の解決策は、メソッドの両方のコールバックで接続を閉じることです。ダミーコードはこちらです。

const newTodo = new Todo({text:'cook dinner'});

newTodo.save().then((docs) => {
  console.log('todo saved',docs);
  mongoose.connection.close();
},(e) => {
  console.log('unable to save');
});

1

ジェイク・ウィルソンが言ったように:接続を変数に設定し、完了したらそれを切断することができます:

let db;
mongoose.connect('mongodb://localhost:27017/somedb').then((dbConnection)=>{
    db = dbConnection;
    afterwards();
});


function afterwards(){

    //do stuff

    db.disconnect();
}

または非同期関数内の場合:

(async ()=>{
    const db = await mongoose.connect('mongodb://localhost:27017/somedb', { useMongoClient: 
                  true })

    //do stuff

    db.disconnect()
})

それ以外の場合、自分の環境でチェックしていたときにエラーが発生しました。


0

おそらくあなたはこれを持っています:

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

// Do some stuff

db.disconnect();

しかし、あなたはこのようなものを持つこともできます:

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

const model = mongoose.model('Model', ModelSchema);

model.find().then(doc => {
  console.log(doc);
}

呼び出すことはできませんがdb.disconnect()、使用後は接続を閉じることができます。

model.find().then(doc => {
  console.log(doc);
}).then(() => {
  mongoose.connection.close();
});
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.