web-dev-qa-db-ja.com

Mongooseで「MongoError:最初の接続でサーバーに接続できませんでした」を処理する最良の方法

この mongooseのGitHubの問題 開発者は、MongoDBへの最初のデータベース接続が失敗した場合にNode.jsプロセスをクラッシュさせることが意図された動作であると述べました。再接続を試みる代わりに、これを行います。

私のコードでは、ログに記録したいので、このエラーをキャッチします。

var mongooseOptions = { 
    useMongoClient: true,
    reconnectInterval: 10000,
    reconnectTries: Number.MAX_VALUE 
};

mongoose.connect(connectionString, mongooseOptions)
    .catch(err => {
        logger.error('Mongodb first connection failed: ' + err.stack);
        // what to do here? - process.exit(0); maybe?
    });

しかし、その後のベストプラクティスは何でしょうか。プロセスをクラッシュさせますか?または独自の再接続ロジックを記述しますか? (Linuxでsystemdを使用して)mongodb.serviceを開始するための要件として、node.serviceがリストされていることについても触れておきます。

[Unit]
After=mongodb.service
...

また、これがどのくらいの頻度で発生するかを予測することもできません。

このガイド も使用しましたが、明確な答えが見つかりません。

2
NG.

私もあなたの質問への答えを探しています。これまでのところ、私の検索では、process.exitの呼び出しが最適な方法であると考えています。 Mongooseでは、mongooseがMongoDBへの接続を確立するのを待たずに、モデルの使用をすぐに開始できるためです。これは、mongooseバッファが関数呼び出しを内部的にモデル化しているためです。

Mongoose 5.0.10以降-接続せずにモデルを使用した場合、Mongooseはデフォルトでエラーをスローしません。

接続が再接続に失敗した場合、アプリは実際には失敗するが、バッファを介してモデル操作を実行していると考えています。

開発者が次のようなMongodb URIを追加するのを見てきました。

mongoose.connect(URI1||URI2);

結局のところ、アプリが無用なバッファでモデル関数を実行するのではなく、常にデータベースに接続できるようにする必要があります。

バッファリングを無効にするオプションがありますが、それがパフォーマンスにどのように影響するかはわかりません。

1
metal_jacke1