このページでは、MongoDB Node.js ドライバーを使用して MongoDB 配置に接続する際に発生しがちな問題に対する潜在的な解決策を提供します。
注意
このページでは、接続の問題のみを説明します。 MongoDB またはドライバーに関するその他の問題が発生した場合は、次のリソースにアクセスしてください。
Node.js ドライバーのよくある質問(FAQ)
問題とヘルプのページには、バグの報告方法、ドライバーへの貢献方法、およびリソースの検索方法に関する情報が記載されています
質問、ディスカッション、または一般的な技術サポート用のMongoDB Stack Overflowタグ またはMongoDB Reddit Community
接続エラー
次のエラー メッセージは、ドライバーが指定されたホスト名またはポートでサーバーに接続できないことを示しています。 このエラー メッセージは、複数の状況で生成される可能性があります。 このエラー メッセージの例では、ホスト名は 127.0.0.1で、ポートは27017です。
Error: couldn't connect to server 127.0.0.1:27017
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
接続stringを確認する
接続stringのホスト名とポート番号が両方とも正確であることを確認してください。 MongoDB インスタンスのデフォルトのポート値は27017ですが、MongoDB を別のポートで通信するように構成できます。
ファイアウォールを構成する
MongoDB 配置がリッスンするポートが同じネットワーク上のファイアウォールによってブロックされていないことを確認します。 MongoDB はデフォルトでポート27017を使用します。 MongoDB が使用するデフォルトのポートとその変更方法について詳しくは、「デフォルトの MongoDB ポート 」を参照してください。
警告
MongoDB 配置で使用されるポートであることが確実な場合を除き、ファイアウォールでポートを開かないでください。
ECONNFUSED エラー
ドライバーが MongoDB インスタンスに接続しようとしたときに接続が拒否された場合は、次のエラーメッセージが生成されます。
MongoServerSelectionError: connect ECONNREFUSED <IPv6 address>:<port>
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
MongoDB とクライアントが同じプロトコルを使用するようにする
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の値を設定して、許可される最大接続数を減らします。 あるいは、オペレーティング システムでファイル記述子の制限を増やすこともできます。
警告
オペレーティングシステムの構成を変更するときは、常に注意が必要です。
認証エラー
認証が正しく構成されていない場合、Node.js ドライバーは MongoDB インスタンスに接続できない可能性があります。 認証にSCRAM-SHA-256を使用しており、ドライバーが接続に失敗した場合、ドライバーは次のいずれかのメッセージのようなエラー メッセージを表示することがあります。
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server <hostname>:<port>.
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
接続stringを確認する
無効な接続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);
これが問題であるかどうかは、同じコードを使用してローカルマシンでホストされている MongoDB インスタンスに接続しようとすることで確認できます。 同じマシン上の配置では、接続するための認可は必要ありません。
メッセージの送信エラー
リクエストを行った後にドライバーがコマンドの送信に失敗すると、次のエラー メッセージが表示される場合があります。
com.mongodb.MongoSocketWriteException: Exception sending message
次のセクションでは、問題を解決するために実行できるアクションについて説明します。
ユーザー権限の確認
正しいユーザーが MongoDB 配置にアクセスしたことを確認します。 エラー内の「メッセージ」というタームは、ドライバーによって送信されたコマンドである場合があります。 コマンドを送信する権限を持たないユーザーを使用している場合、ドライバーはこのエラーを生成する可能性があります。
また、ユーザーが送信するメッセージに対する適切な権限を持っていることも確認します。 MongoDB は、RBAC(Role-Based Access Control、ロールベースのアクセス制御)を使用して、MongoDB 配置へのアクセスを制御します。 MongoDB で RBAC を構成する方法の詳細については、「デフォルトの MongoDB ポート 」を参照してください。
ファイアウォールを構成する
ファイアウォールは MongoDB インスタンスと通信するためにオープンなポートが必要です。 ファイアウォールの構成の詳細については、「 接続エラー 」セクションの「 ファイアウォールを構成する 」を参照してください。
接続数の確認
各MongoClientインスタンスは、接続プール内で同時にオープンする接続の最大数をサポートします。 この制限を定義するパラメータmaxPoolSizeを構成できます。 デフォルト値は100です。 すでに開いている接続の数がmaxPoolSizeに等しい場合、サーバーは接続が利用可能になるまで待機します。 この待機時間がmaxIdleTimeMSの値を超えると、ドライバーはエラーで応答します。
接続プーリングの仕組みの詳細については、「 ノード ドライバーで接続プーリングがどのように機能するか 」を参照してください。 FAQ に記載されています。
オープンな接続が多すぎる
ドライバーは接続を開始しようとしたが、最大接続数に達したときに次のエラー メッセージを作成します。
connection refused because too many open connections
次のセクションでは、問題を解決するのに役立つ方法について説明します。
接続数の確認
よりオープンな接続を作成するには、 maxPoolSizeの値を増やします。 接続数の確認の詳細については、「 メッセージの送信エラー 」セクションで「 接続数を確認する 」を参照してください。
タイムアウト エラー
ネットワークがドライバーからサーバーにリクエストを十分な速度で提供できない場合、タイムアウトが発生することがあります。 その場合、次のメッセージのようなエラー メッセージが表示される場合があります。
timed out while checking out a connection from connection pool: context canceled
このエラーが発生した場合は、問題を解決するために次のアクションをお試しください。
connectTimeoutMS の設定
到達不能なレプリカセット ノードへのアクセスに時間がかかりすぎるため、接続を確立できない場合、ドライバーがハングすることがあります。 connectTimeMS設定を使用すると、ドライバーが接続を確立するために費やす時間を制限できます。 この設定の詳細については、サーバー マニュアルの「タイムアウト オプション 」を参照してください。
connectTimeoutMSの設定が、セットのノードに対する最高のネットワーク レイテンシよりも低くないことを確認します。 セカンダリ ノードの 1 つのレイテンシが10000ミリ秒の場合、 connectTimeoutMSを9000に設定すると、ドライバーはそのノードに接続できなくなります。
次の例では、 connectTimeoutMSを 10000 ミリ秒に設定しています。
const client = new MongoClient(uri, { connectTimeoutMS: 10000, });
接続数の確認
サーバーへの接続数がmaxPoolSizeを超える可能性があります。 接続数の確認の詳細については、「 メッセージの送信エラー 」セクションで「 接続数を確認する 」を参照してください。