Node.jsからMongoDBにアクセスできない時の対処法

 

Node.jsからMongoDBへアクセスしようとしたところ、エラーが発生したため対処した。その過程で調べたことをまとめる。

 

その1|[Could not connect to any servers in your MongoDB Atlas cluster]と表示される場合の対処法

エラーの全文は次の通り。

error:MongooseServerSelectionError: Could not connect to any servers in your MongoDB Atlas cluster. One common reason is that you're trying to access the database from an IP that isn't whitelisted. Make sure your current IP address is on your Atlas cluster's IP whitelist: https://docs.atlas.mongodb.com/security-whitelist/

(訳:MongoDB Atlas clusterの中のどのサーバーにも接続できませんでした。あるあるな原因の1つが、ホワイトリストに登録されていないIPアドレスからアクセスしていることです。現在のIPアドレスがホワイトリストに含まれていることを確認してください。)

 

ということで早速MongoDBの管理画面にログインして、左サイドバーの「Security」セクションの「Network Access」に移動して、以下の手順で現在使用しているIPアドレスを追加します。

  1. 「ADD IP ADDRESS」を選択
  2. 現在使用しているIPアドレスとコメント(任意)を入力
  3. ※現在使用しているIPアドレスが分からない場合は、「add current ip address」か「allow access from anywhere」を選択してください
  4. 「Confirm」を選択
  5. StatusがPending→Activeに変わったら完了

 

2,3で「add current ip address」を選択すると、現在使用しているIPアドレスが自動で入力されるっぽいです。「allow access from anywhere」を選択すると、誰でもDBにアクセスできるようになってしまうらしく、セキュリティ上よろしくないと思います。

 

その2|データベース名、ユーザー名、パスワードに問題がある場合

Node.jsからMongoDBに接続する場合、index.jsファイルにて次のようなコードを記載する必要がありますが、ここにミスがあるとうまく接続できません。

mongodb+srv://<username>:<password>@<clusterName>.p9ykp.mongodb.net/<databaseName>?retryWrites=true&w=majority

※このコードは、MongoDBの管理画面から「DEPLOYMENT」セクションの「Database」を選択して、(任意のクラススターフィールドの)「Connect」ボタンをクリックすると表示・取得できます。

  • <username>:MongoDBで使用しているユーザーネームを入力
  • <password>:MongoDBへのログインパスワードorDBパスワード
  • <clusterName>:MongoDBで使用しているクラスターネーム
  • <databaseName>:接続したいデータベース名

 

その3|ファイアウォールに問題がある場合

Windowsのファイアウォールに問題があると、上手く接続できないケースがあるようです。(僕は違いましたが)

 

これに関しては、stack overflowの質問が参考になると思います。

getting ReplicaSetNoPrimary and MongoServerSelectionError error while connecting MongoDB with nodejs

 

まとめ

とりあえず以上です。

また、新しいエラーに遭遇し次第追記したいと思います。ご意見あればご指摘いただけると嬉しいです。