MongooseError: Operation `goods.insertOne()` buffering out after 10000ms
MongoDB를 오늘 학습하면서 겪었던 문제(맨 아래 내용정리 있습니다.)
주특기 node.js 학습 2일차 몽고디비 연습 중 원인을 알 수 없는 오류에 시달렸습니다.
강의 영상대로 잘 따라하고 있었는데 서버를 3000포트로 열고, Thunder Client에서 POST로 주소 값을 주고 Body에 코드 값을 주고 Send를 눌렀는데 반환하는 값이 안 뜨고 오류가 떠버렸습니다 아래는 node app.js 실행 시 화면인데 이때 까지만 해도 순조롭게 진행되는 줄 알았습니다.
console.log로 서버 연결 오류 값을 미리 작성했기 때문에 로그가 안 찍혀 연결된 상태로 착각했습니다.
MongooseError: Operation `goods.insertOne()` buffering out after 10000ms MongoServerSelectionError: connect ECONNREFUSED ::1:27017
처음에는 영상을 보고 연습한 코드가 잘못된 줄 알고 한 시간 넘게 마침표 하나까지 두 세 번 씩 체크하면서 확인하였으나 영상 속 코드와 제가 작성한 코드의 차이점을 발견하지 못했습니다. 터미널에서는 계속 시간 초과에 관련된 오류를 가리켰기에 불러오는 코드 문제로 착각했던 것 같습니다.
이다음으로 예상한 오류는 studio 3T었습니다. Local에서 기존에 만들었던 New connection을 잘 못 만들었거나 설정을 잘못했나 싶어서 기존에 데이터를 삭제하고 spa_mall로 작업 중인 이름을 따라서 다시 만들고 테스트하였습니다. 하지만 여러 테스트를 거쳤지만 원인이 아닌 것 같았습니다. 애초에 작업을 따라 하는 영상 속에서도 POST에서 반환하는 값이 뜨고 나서 3T를 설정했기 때문에 다시 원인을 찾아봤습니다.
한참을 헤맨 끝에 한 가지 원인을 발견했습니다. 서버를 포트로 열고 오래 기다려봤는데 몽고디비 연결 에러가 뜨는 것을 찾을 수 있었습니다. 덕분에 에러의 해결 방향을 잡을 수 있었습니다.
해결하고자 했던 시도
[1] mongosh를 이용하여 명령어 실행
몽고디비에 다시 연결하기 위해 로컬 C 파일에서 data/db/bin 경로로 들어가 mongosh를 실행하여 연결을 다시 확인하였습니다.
→ MongoDB 파일 저장 위치에서 오류를 잡기 위한 시도
→ 잘 설치가 된 것을 확인했지만 밑에 경고를 못 보고 지나쳤습니다.
[2] mongosh를 이용하여 문자열 테스트
서버가 부팅할 때 이러한 시작 경고를 생성했습니다. 처음엔 뭐지? 싶었다가 밑에 경고를 나중에 발견하고 일단 문자열이라도 테스트 해보자해서 테스트 해봤습니다.
→ 테스트는 이상이 없어 보였습니다.
[3] 명령프롬프트에서 실행해보기
점점 더 미궁으로 빠졌습니다. 설치도 잘 되어있고 값들도 잘 나오는데 뭐가 문제일지 싶었습니다. 운 좋게 stackoverflow에서 저와 유사한 상황의 글을 발견했습니다. 현재 상황에서 서버가 만들어지지 않아서 생긴 문제라는데... 음... 일단 찾은 방법으로 시도해 보기 위해 mongosh 명령 창을 닫고 cmd 명령 프롬프트에서 진행해 봤습니다.
→ 명령프롬프트에서 mongod를 검색
[4] 명령프롬프트에서 서버 생성을 위한 경로 넣어주기
mongod를 실행해 보니 서버 생성이 진행되지 않아서 생긴 오류가 맞았습니다. 다시 한번 서버 생성을 위해 경로를 넣어주고 실행을 해봤습니다.
→ 명령프롬프트에 경로 설정
[5] 명령프롬프트에서 mongod -dbpath "주소" 값에 --IPv6 코드를 추가
네 맞습니다. 해결될 줄 알았는데 또다시 오류가 떠버렸습니다. 내용을 찾아보니 mongod -dbpath "주소" 값에 --IPv6 코드를 추가해야 서버 문제를 해결할 수 있다고 해서 다시 수정해 봤습니다.
→ mongod -dbpath "주소"값에 --ipv6 코드를 추가
크게 바뀐 게 없어서 긴가민가했었는데 혹시 몰라서 이 상태에서 다시 node app. JS를 다시 호출해 보고 기다려 보기로 했습니다.
→ 데이터 베이스 연결 성공!
드디어 Terminal에서 데이터베이스 연결 성공 console.log가 동작했습니다. 곧바로 Thunder Client로 이동하여 POST로 URL 값을 설정하고 Body에 코드 값을 입력 후 Send를 눌렀는데 드디어!! 이 문제를 해결했습니다. ㅠㅠ
→ 데이터 베이스 연결 후 정상 작동
문제를 해결하게 되면서 비록 오늘 목표치만큼 강의를 전부 수강 하진 못했지만 예상치 못한 오류로 인해 값진 경험을 했다고 생각합니다. 덕분에 오늘도 1% 성장한 하루였습니다. 아! 그리고 옆에서 도움을 주신 able 팀장님께 정말 감사드립니다.
최종 해결 방법
문제
- 서버를 3000포트로 열고 POST 요청을 Thunder Client로 보냈을 때 반환 값이 표시되지 않고 오류가 발생함.
- 몽고디비 연결 오류 발생.
해결 과정
mongosh를 이용하여 몽고디비에 연결 상태를 확인하고 로컬 데이터베이스 경로를 설정.
- 몽고디비에 연결은 정상이었으나 서버 부팅 시 경고가 생성되었음. 이 경고를 확인하기 위해 문자열 테스트 진행.
- 서버가 정상적으로 생성되지 않아 문제가 발생했을 가능성이 있어, 명령 프롬프트에서 mongod 명령을 실행하여 경로 설정을 시도.
- 명령 프롬프트에서 mongod 명령을 실행 시 --dbpath 옵션과 함께 --ipv6 코드를 추가하여 서버를 다시 생성.
- 이후, 몽고디비와 서버 연결에 성공하고 node app.js를 실행하여 POST 요청을 성공적으로 보내고 응답을 받음.
더 쉽게 해결하는 방법
어제 저녁 슬랙에 공지로 올라왔던 글을 보고 더 쉬운 방법을 알게 되었습니다.
mongoose 를 통해 node에서 connected 에러가 나는 경우 기존의 index.js 파일에서 localhost:27017을 수정하면 되는데 개인 컴퓨터 중 (특히 윈도우 사용자들 ) 자신의 IP 127.0.0.1과 localhost라는 도메인이 연결이 안되어 있으면 컴퓨터 자신을 찾지 못해 에러가 발생한다고 합니다.
localhost 수정 전
localhost:27017로 수정 후
이 방법으로도 데이터베이스 연결 성공
POST에서 Send 테스트시 동작 완료