このページでは、MongoDB Node.js ドライバーを使用して MongoDB 配置に接続する際に発生しがちな問題に対する潜在的な解決策を提供します。
注意
このページでは、接続の問題のみを説明します。 MongoDB またはドライバーに関するその他の問題が発生した場合は、次のリソースにアクセスしてください。
問題とヘルプ ページには、バグの報告方法、ドライバーへの貢献方法、およびリソースの検索方法に関する情報が記載されています
質問、ディスカッション、または一般的な技術サポートについては、 MongoDB Stack OverflowタグまたはMongoDB Reddit Communityを使用してください。
接続エラー
ドライバーが指定されたホストに接続できない場合は、MongoServerSelectionError が返されることがあります。
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
ファイアウォールを構成する
MongoDBデプロイがリッスンするポートが同じネットワーク上のファイアウォールによってブロックされていないことを確認します。MongoDB はデフォルトでポート 27017 を使用します。MongoDBが使用するデフォルトのポートとその変更方法の詳細については、 MongoDB ServerマニュアルのデフォルトのMongoDBポートを参照してください。
警告
MongoDB 配置で使用されるポートであることが確実な場合を除き、ファイアウォールでポートを開かないでください。
ネットワーク アクセス リストの確認
IPアドレスがクラスターのIPアクセス リストに表示されていることを確認します。IPアクセス リストは、 Atlas UIの [ネットワーク アクセス] セクションで確認できます。IPアクセス リストの設定方法の詳細については、Atlas ドキュメントの「 IPアクセス リスト エントリの構成 」ガイドを参照してください。
ECONNFUSED エラー
ドライバーがMongoDBインスタンスに接続しようとしたときに接続が拒否された場合は、次のようなエラー メッセージが生成されます。
MongoServerSelectionError: connect ECONNREFUSED <IPv6 address>:<port>
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
MongoDBとクライアントが同じIPアドレスを使用するようにします
Node.js v17 以降では、クライアントと ホストの両方が両方をサポートしている場合、DNS リゾルバはデフォルトでIPv6を使用します。 たとえば、MongoDB が IPv4 を使用し、クライアントが IPv6 を使用している場合、ドライバーは前のエラー メッセージを返します。
mongodまたはmongosで起動する場合、 IPv6モードを使用するように MongoDB 配置を構成できます。 IPv6モードを指定する方法の詳細については、サーバー マニュアルの「 IP バインディング」を参照してください。
IPv4family: 4あるいは、MongoClient のオプションとして を指定することで、クライアントで を明示的に使用できます。
const client = new MongoClient(uri, { family: 4, });
ECONNリセット エラー
ドライバーが client.connect() を呼び出すときに接続がリセットされた場合、次のようなエラー メッセージが生成されます。
MongoServerSelectionError: connect ECONNRESET ::<IP address>:<port>
次のセクションでは、問題を解決するのに役立つ方法について説明します。
ファイル記述子の数を制御する
ファイル記述子は、開いているプロセスに関連付けられた一意の識別子です。 ほとんどのオペレーティング システムでは、ドライバーからオープンする各接続はファイル記述子に関連付けられています。 オペレーティング システムでは通常、1 つのプロセスで使用されるファイル記述子の数に制限があります。 接続数がこの制限を超えると、 ECONNRESETエラーが発生する可能性があります。
maxPoolSize を設定することで、最大接続数を設定できます。このエラーを解決するには、maxPoolSize の値を設定して、許可される最大接続数を減らします。あるいは、オペレーティング システムでファイル記述子の制限を増やすこともできます。maxPoolSize を設定する方法の詳細については、maxPoolSize のAPIドキュメントを参照してください。
警告
オペレーティングシステムの構成を変更するときは、常に注意が必要です。
認証エラー
認証が正しく構成されていない場合、Node.js ドライバーは MongoDB インスタンスに接続できない可能性があります。 認証にSCRAM-SHA-256を使用しており、ドライバーが接続に失敗した場合、ドライバーは次のいずれかのメッセージのようなエラー メッセージを表示することがあります。
MongoServerError: bad auth : authentication failed
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
接続stringを確認する
無効な接続文字列は、SCRAM-SHA-256 を使用してMongoDBに接続しようとする際に認証する最も一般的な原因です。
Tip
接続文字列の詳細については、 接続ガイド の「接続 URI」セクションを参照してください。
接続文字列にユーザー名とパスワードが含まれている場合は、それらが正しい形式であることを確認してください。ユーザー名またはパスワードに次の文字のいずれかが含まれている場合は、 パーセント エンコードされている必要があります。
: / ? # [ ] @
次の例は、"#MyP@assword?" をパーセント エンコードする方法を示しています。
console.log(encodeURIComponent('#MyP@assword?'));
これにより、次の出力が得られます。
"%23MyP%40assword%3F"
認証データベースでユーザーが であることを確認
SCRAM-SHA-256でユーザー名とパスワードを使用して接続を正常に認証するには、認証データベースでユーザー名を定義する必要があります。 デフォルトの認証データベースはadminデータベースです。 認証に別のデータベースを使用するには、 接続stringで authSource を指定します。 次の例では、認証データベースとしてusersを使用するようにドライバーに指示しています。
const { MongoClient } = require("mongodb"); const uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users"; const client = new MongoClient(uri);
メッセージの送信エラー
リクエストを行った後にドライバーがコマンドの送信に失敗すると、次のエラー メッセージが表示される場合があります。
com.mongodb.MongoSocketWriteException: Exception sending message
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
ユーザー権限の確認
正しいユーザーが MongoDB 配置にアクセスしたことを確認します。 エラー内の「メッセージ」というタームは、ドライバーによって送信されたコマンドである場合があります。 コマンドを送信する権限を持たないユーザーを使用している場合、ドライバーはこのエラーを生成する可能性があります。
また、ユーザーが送信するメッセージに対する適切な権限を持っていることも確認します。 MongoDB は、RBAC(Role-Based Access Control、ロールベースのアクセス制御)を使用して、MongoDB 配置へのアクセスを制御します。 MongoDB で RBAC を構成する方法の詳細については、「デフォルトの MongoDB ポート 」を参照してください。
ファイアウォールを構成する
ファイアウォールは MongoDB インスタンスと通信するためにオープンなポートが必要です。 ファイアウォールの構成の詳細については、「 接続エラー 」セクションの「 ファイアウォールを構成する 」を参照してください。
接続数の確認
各MongoClientインスタンスは、接続プール内で同時にオープンする接続の最大数をサポートします。 この制限を定義するパラメータmaxPoolSizeを構成できます。 デフォルト値は100です。 すでに開いている接続の数がmaxPoolSizeに等しい場合、サーバーは接続が利用可能になるまで待機します。 この待機時間がmaxIdleTimeMSの値を超えると、ドライバーはエラーで応答します。
接続プーリングの仕組みの詳細については、「 接続プール 」ページの「 接続プールの概要 」を参照してください。
タイムアウト エラー
ネットワークがドライバーからサーバーにリクエストを十分な速度で提供できない場合、タイムアウトが発生することがあります。 その場合、次のメッセージのようなエラー メッセージが表示される場合があります。
timed out while checking out a connection from connection pool: context canceled
このエラーが発生した場合は、問題を解決するために次のアクションをお試しください。
connectTimeoutMS の設定
到達不能なレプリカセット ノードへのアクセスに時間がかかりすぎるため、接続を確立できない場合、ドライバーがハングすることがあります。 connectTimeoutMS設定を使用すると、ドライバーが接続を確立するために費やす時間を制限できます。 この設定の詳細については、サーバー マニュアルの「タイムアウト オプション 」を参照してください。
connectTimeoutMSの設定が、セットのノードに対する最高のネットワーク レイテンシよりも低くないことを確認します。 セカンダリ ノードの 1 つのレイテンシが10000ミリ秒の場合、 connectTimeoutMSを9000に設定すると、ドライバーはそのノードに接続できなくなります。
次の例では、 connectTimeoutMSを 10000 ミリ秒に設定しています。
const client = new MongoClient(uri, { connectTimeoutMS: 10000, });
操作の実行中にクライアントが切断
MongoDB Serverバージョン 4.2 以降では、クライアントの接続が切断されると、サーバーは集計や検索操作などの実行中の操作を終了します。
クライアントの接続が切断されても、書込み操作などの他の操作は MongoDB Server 上で引き続き実行されます。 この動作により、クライアントが切断した後にアプリケーションが操作を再試行すると、データの不整合が発生する可能性があります。
予期しないネットワーク動作
アプリケーションと MongoDB 間のファイアウォールの構成が正しく行われていない場合、予期しないネットワーク動作が発生する可能性があります。 これらのファイアウォールは接続の削除が過剰になるため、予期しないエラーが発生する可能性があります。
ファイアウォールが次の動作を示していることを確認します。
ファイアウォールは接続を閉じるときに
FINパケットを送信し、ソケットが閉じられたことをドライバーに通知します。ファイアウォールはキープアライブ メッセージを許可します。
Tip
keepalive メッセージの詳細については、 接続オプション ページの「 keepAlive 接続オプション 」セクションを参照してください。
レプリカセットの接続文字列エラー
ドライバーに渡される接続文字列では、レプリカセット構成で設定されているように、サーバーの正確なホスト名を使用する必要があります。レプリカセットが次の構成設定になっている場合、レプリカセットの検出とフェイルオーバーを機能させるには、ドライバーは server1、server2、server3 へのアクセス権が必要です。
{ "_id": "testSet", "version": 1, "protocolVersion": 1, "members": [ { "_id": 1, "host": "server1:31000" }, { "_id": 2, "host": "server2:31001" }, { "_id": 3, "host": "server3:31002" } ] }