1

autoReconnectメソッド内のマングースオプションと本当に混同していmongoose.connectます。私の問題は、データベース接続の準備が整う前にサーバーが起動する可能性があることです。そのため、サーバー コードの開始時にこれを処理する必要があります。さて、私が今まで持っているものを説明しましょう:

まず、文書化された方法を試しました:

const db = mongoose.connection;
db.once('open', () => console.log('database connected'));
mongoose.connect(dbUri, { autoReconnect: true });

ちょっと動作します (mongo console shows: I NETWORK [listener] connection accepted from 127.0.0.1:52896 #1 (1 connection now open)) が、コールバックを呼び出すことはありませんopen。ただし、このソリューションの本当に奇妙な点は、db.readyState決してならないことです1(これが、コールバックが呼び出されない理由だと思います)。

その後、解決策を検索したところ、ここgithubなど、いくつかの解決策が見つかりました。それらを要約すると、基本的な解決策は次のとおりです。

function connect() {
    mongoose.connect(dbUri, { autoReconnect: true });
}

const db = mongoose.connection;

db.once('open', () => console.log('database connected'));

db.on('error', () => {
    console.log('database connection error');
    mongoose.disconnect();
});

db.on('disconnected', () => {
    console.log('database disconnected.');
    connect();
});

connect();

繰り返しますが、このソリューションキダも機能しますが、今回は、メソッドを呼び出すたびにconnect()新しい接続が作成されるため、mongo コンソールには次のようなものが表示されます。

I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #5 (35 connections now open)
I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #6 (36 connections now open)
I NETWORK  [listener] connection accepted from 127.0.0.1:52896 #7 (37 connections now open)
...

遊んでみると、それはautoReconnectオプションのせいだとわかりました。false に設定した場合 (ドキュメントでは実際には推奨されていません)、データベースの準備ができたときに単一の接続が確立されます。autoReconnectしかし、それは接続が確立されたときだけでなく、アプリケーションの実行を通じてアクティブになっている間に行うことを意味すると思います。

それで、私はここで何が欠けていますか?最初の例で私がすべきことはありますか? 複数の接続を維持autoReconnectして無視しますか? または、私が見つけられなかった別の解決策がありますか?

  • ノード: 8.9.0
  • モンゴDB: 3.6.5
  • マングース: 5.0.11
4

0 に答える 0