Could not connect to any servers in your MongoDB Atlas cluster

0xMegg·2021년 10월 25일
1
post-thumbnail

사건의 시작

인프런에서 따라하며 배우는 노드, 리액트 시리즈 - 기본 강의의 #3에서 mongoose를 통해 mongoDB를 연결하는 것을 배우던 중이었다.

$ npm run start

> boiler-plate@1.0.0 start /Users/ero/Dev/boiler-plate
> node index.js

Example app listening at http://localhost:5000
MongoDB Connected...

강사님께서 npm run start를 치자 강의 속의 터미널은 위와 같이 출력됐다. 나 역시 놓친것 없이 따라했으니 강의와 같은 결과가 나올줄 알았으나 MongoDB가 연결되지 않았는지 마지막 줄이 출력되지 않았다.

클러스터에 IP 등록하기

(node:5153) UnhandledPromiseRejectionWarning: 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/
    at NativeConnection.Connection.openUri (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/connection.js:797:32)
    at /Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/index.js:330:10
    at /Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
    at new Promise (<anonymous>)
    at promiseOrCallback (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
    at Mongoose._promiseOrCallback (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/index.js:1151:10)
    at Mongoose.connect (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/index.js:329:20)
    at Object.<anonymous> (/Users/ero/Dev/boiler-plate/index.js:6:10)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10)
(Use `node --trace-warnings ...` to show where the warning was created)
(node:5153) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:5153) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

VScode, node.js, express, mongoDB, mongoose 무엇 하나 익숙하지 않은 내게는 에러코드를 어디서 찾아야하고 어떻게 해석해야하는지부터가 난관이다. 그래도 다행히 터미널을 보고 있을때 에러메세지가 나오기 시작하였고, 내가 화이트리스트에 등록되어있지 않다는 것을 알 수 있었다.

내 클러스터 => Network Acccess => Add IP Address 순서대로 들어오면 해당 스크린샷 같은 페이지에 도달한다. ADD CURRENT IP ADDRESS를 눌러 간단히 내 아이디를 첫 텍스트박스에 넣고, 간단한 메모를 적어 마무리한다. 옆의 ALLOW ACCESS FROM ANYWHERE은 어디서든 접근 가능하게 하는 것으로 보인다. 실제로 눌러보면 0.0.0.0/0가 자동 기입 된다. 어차피 중요한것도 없고 편해보이지만 긁어 부스럼 같아 패스했다.

MongoDB 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/
    at NativeConnection.Connection.openUri (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/connection.js:797:32)
    at /Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/index.js:330:10
    at /Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/helpers/promiseOrCallback.js:32:5
    at new Promise (<anonymous>)
    at promiseOrCallback (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/helpers/promiseOrCallback.js:31:10)
    at Mongoose._promiseOrCallback (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/index.js:1151:10)
    at Mongoose.connect (/Users/ero/Dev/boiler-plate/node_modules/mongoose/lib/index.js:329:20)
    at Object.<anonymous> (/Users/ero/Dev/boiler-plate/index.js:6:10)
    at Module._compile (internal/modules/cjs/loader.js:1085:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1114:10) {
  reason: TopologyDescription {
    type: 'ReplicaSetNoPrimary',
    servers: Map(3) {
      'boilerplate-shard-00-02.2q2jt.mongodb.net:27017' => [ServerDescription],
      'boilerplate-shard-00-00.2q2jt.mongodb.net:27017' => [ServerDescription],
      'boilerplate-shard-00-01.2q2jt.mongodb.net:27017' => [ServerDescription]
    },
    stale: false,
    compatible: true,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    setName: 'atlas-twxj3c-shard-0',
    logicalSessionTimeoutMinutes: undefined
  }
}

IP Adress를 추가가 된것을 본 직후에 npm run start를 돌렸을 때는 똑같은 에러가 떴고, 혹시나 해서 한번 더 돌려보니 에러 코드가 바뀌었다. IP에 문제가 있나?


현재 테더링을 통해서 맥을 사용중이기에 아이폰의 아이피가 현재의 내 아이피이다. 내 아이폰의 IP를 등록시켜보고 다시 시도해본다. 여전히 같은 에러가 뜬다.

ALLOW ACCESS FROM ANYWHERE를 통해서라도 접속하고자 들어가보니 아까의 ADD CURRENT IP ADDRESS 버튼이 보이지 않는다. 이미 현재의 IP는 등록이 되어있다는 뜻으로 보여서 무척 열받는다.

미봉책

ero@Kimui-MacBookAir:~/Dev/boiler-plate » npm run start                                                                                                       130> boiler-plate@1.0.0 start /Users/ero/Dev/boiler-plate
> node index.js

Example app listening at http://localhost:5000
MongoDB Connected...

0.0.0.0/0IP를 등록하고 나니 바로 해결됐다. 심지어 이전까지는 npm run start를 치면 Example app listening at http://localhost:5000이후는 한참 뒤에 나왔는데 이번엔 엔터와 동시에 나왔다. 언젠가 좀 더 공부를 하면 내 IP로 해결하고 글을 수정해야겠다.

요약

  1. express에 mongoose를 통해 mongoDB가 연결되지 않음.
  2. 1에 대한 해결책으로 내 cluster에 ip를 등록해야 한단 것을 찾음.
  3. mongodb 사이트에서 내 컴퓨터의 ip를 등록했으나 여전히 연결되지 않음.
  4. 내 컴퓨터에 테더링을 하고 있는 핸드폰의 ip를 등록했으나 여전히 연결되지 않음.
  5. IP에 관계 없이 접속을 허용해주게끔 0.0.0.0/0를 등록하자 일단은 해결됨.
profile
코미디언

1개의 댓글

comment-user-thumbnail
2022년 12월 10일

덕분에 해결했습니다 감사합니다 ㅎㅎ

답글 달기