MongoClient.connect의 callback이 실행되지 않는 현상

LeeWonjin·2023년 2월 23일
1

문제해결

목록 보기
11/23

Node+Express 강의를 보고 있다. mongodb driver가 db에 연결되기 위해 connect라는 메소드를 호출한다. connect()는 콜백을 받는데 이상하게도 그 콜백을 실행하지 않는 현상을 겪었다.

요약

mongodb 드라이버 5.0에서 MongoClient.connect()에 인수로 콜백 넣지 마라.
그거 이제 없다.
그 대신 then-catch를 하자.

배경

로컬에서 아래 도구들을 사용하고 있다.

  • express 4.18.2
  • mongodb (driver) 5.0.1
  • node 16.13.1

mongodb는 atlas에서 호스팅받아 사용하고 있다.

  • 클러스터 버전 5.0.14

하려는 일은 다음과 같다.

  • index.js를 실행한다.
  • mongodb 드라이버와 atlas 사이 연결을 체결한다.
  • 연결이 에러없이 잘 되었다면
    • express의 listen을 호출한다.
    • atlas의 임의의 데이터베이스 - 콜렉션에 한 아이템을 추가한다.
  • 연결에 문제가 있다면
    • 에러를 콘솔에 출력하고 리턴한다.

그래서 강의에서 배운대로 아래와 같이 코드를 작성했다.

...
const MongoClient = require('mongodb').MongoClient;
const MongoURL = 'mongodb+srv://사용자이름:사용자 비밀번호@클러스터이름.uktonao.mongodb.net/GoraniDB?retryWrites=true&w=majority';
const app = express();
const port = 3000;

MongoClient.connect(MongoURL, (err, database) => {
	console.log('콜백 진입했음');
  
	if (err) {
		console.log('에러에러');
		console.log(err);
		return;
	} else {
		console.log('문제없음');
		app.listen(port, () => {
			console.log(`Example app listening on port ${port}`);
		});
		const db = database.db('GoraniDB');
		const collection = db.collection('MyCollection');
      	collection.insertOne({name:'wonjin'});
	}
});

문제

MongoClient.connect() 메소드의 콜백함수를 실행하지 않는다.

  • 에러가 뜨는가? : 아니요
  • 타임아웃이 나는가? : 아니요
  • 뭔가 피드백이 있긴 한가? : 아니요???????

정말 말 그대로 아무것도 안나온다. 너무 답답했다.

원인

강의에서는 mongodb driver 버전 4.3대를 사용하고 있었다.
나는 5.0대를 사용하고 있다.

정말 혹시나 해서 레퍼런스를 뒤져봤는데 이게 정답이었다.
그렇다. 4.3에서는 connect인수로 콜백이 들어갔었는데, 5.0에서는 콜백이 들어가지 않는다. 😂 (그림 좌측 4.3 / 우측 5.0)

4.3의 connect()
5.0의 connect()

해결

방법 1 : then-catch

클래식한 해결방법이다.

MongoClient.connect(MongoURL)
	.then(database => {
		console.log('문제없음');
		app.listen(port, () => {
			console.log(`Example app listening on port ${port}`);
		});
		const db = database.db('GoraniDB');
		const collection = db.collection('MyCollection');
      	collection.insertOne({name:'wonjin'});
	})
	.catch(err => {
		console.log('에러에러');
		console.log(err);
	})
	.finally(() => {
		console.log('끝');
	});

방법 2 : 가이드 따라하기

여기를 따라한다.

profile
노는게 제일 좋습니다.

0개의 댓글