이 페이지에서는 MongoDB Node.js 드라이버를 사용하여 MongoDB 배포에 연결할 때 발생할 수 있는 문제에 대한 잠재적인 해결 방법을 제공합니다.
참고
이 페이지에서는 연결 문제만 다룹니다. MongoDB 또는 드라이버에 다른 문제가 발생하는 경우 다음 리소스를 방문하세요.
버그를 신고하고, 운전자 에 기여하고, 추가 리소스를 찾는 방법에 대한 정보가 있는 문제 & 도움말 페이지
질문, 토론 또는 일반적인 기술 지원을 위한 MongoDB Community 포럼
연결 오류
운전자 지정된 호스팅하다 에 연결할 수 없는 경우 MongoServerSelectionError
가 발생할 수 있습니다.
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
방화벽 구성
MongoDB deployment 수신 대기하는 포트가 동일한 네트워크의 방화벽 에 의해 차단되지 않았는지 확인합니다. MongoDB 기본값 으로 포트 27017
을(를) 사용합니다. MongoDB 사용하는 기본값 포트와 변경 방법에 대해 자세히 학습 MongoDB Server 매뉴얼의 기본 MongoDB 포트 를 참조하세요.
경고
MongoDB deployment에서 사용되는 포트인지 확실하지 않은 경우 방화벽에서 포트를 열지 않도록 합니다.
네트워크 액세스 목록 확인
IP 주소가 클러스터 의 IP 액세스 목록에 나열되어 있는지 확인합니다. Atlas UI 의 네트워크 액세스 섹션에서 IP 액세스 목록을 찾을 수 있습니다. IP 액세스 목록을 구성하는 방법에 대해 자세히 학습하려면 Atlas 문서에서 IP 액세스 목록 항목 구성 가이드를 참조하세요.
연결 거부 오류
운전자 MongoDB 인스턴스 에 연결하려고 할 때 연결이 거부되면 다음과 유사한 오류 메시지가 생성됩니다.
MongoServerSelectionError: connect ECONNREFUSED <IPv6 address>:<port>
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
MongoDB 와 클라이언트가 동일한 IP 주소를 사용하는지 확인
Node.js v17 이상에서는 클라이언트와 호스트가 모두 둘 다 지원하는 경우 DNS 확인자(resolver)가 기본적으로 IPv6
을 사용합니다. 예를 들어 MongoDB가 IPv4를 사용하고 클라이언트가 IPv6을 사용하는 경우 드라이버는 이전 오류 메시지를 반환합니다.
mongod
또는 mongos
(으)로 시작할 때 IPv6
모드를 사용하도록 MongoDB 배포서버를 구성할 수 있습니다. IPv6
모드를 지정하는 방법에 대한 자세한 내용은 서버 매뉴얼의 IP 바인딩을 참조하세요.
아니면 MongoClient에 대한 옵션으로 family: 4
를 지정하여 클라이언트에서 IPv4
를 명시적으로 사용할 수 있습니다.
const client = new MongoClient(uri, { family: 4, });
ECONNRESET 오류
운전자 client.connect()
를 호출할 때 연결이 재설정되면 다음과 유사한 오류 메시지가 생성됩니다.
MongoServerSelectionError: connect ECONNRESET ::<IP address>:<port>
다음 섹션에서는 문제를 해결하는 데 도움이 될 수 있는 방법에 대해 설명합니다.
파일 디스크립터 수 제어
파일 디스크립터는 열린 프로세스와 연관된 고유 식별자입니다. 대부분의 운영 체제에서 드라이버의 각 열린 연결은 파일 디스크립터와 연결됩니다. 운영 체제에는 일반적으로 단일 프로세스에서 사용하는 파일 디스크립터 수에 제한이 있습니다. 연결 수가 이 제한을 초과하면 ECONNRESET
오류가 발생할 수 있습니다.
maxPoolSize
을(를) 설정하여 최대 연결 수를 설정하다 수 있습니다. 이 오류를 해결하려면 maxPoolSize
값을 설정하여 허용되는 최대 연결 수를 줄일 수 있습니다. 또는 운영 체제에서 파일 설명자 제한을 늘릴 수도 있습니다. maxPoolSize
설정하다 방법에 대한 자세한 학습 은 maxPoolSize 에 대한 API 설명서를 참조하세요.
경고
운영 체제의 구성을 변경할 때는 항상 주의하세요.
인증 오류
승인이 올바르게 구성되지 않은 경우 Node.js 드라이버가 MongoDB 인스턴스에 연결하지 못할 수 있습니다. 인증에 SCRAM-SHA-256
을 사용하는데 드라이버가 연결에 실패할 경우, 드라이버에서 다음 메시지 중 하나와 유사한 오류 메시지를 표시할 수 있습니다:
MongoServerError: bad auth : authentication failed
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
연결 문자열 확인
잘못된 연결 문자열 SCRAM-SHA-256
을(를) 사용하여 MongoDB 에 연결하려고 할 때 인증 문제를 일으키는 가장 일반적인 원인입니다.
팁
연결 문자열에 대한 자세한 내용은 연결 가이드의 연결 URI 섹션을 참조하세요.
연결 문자열에 사용자 이름과 암호가 포함된 경우 올바른 형식인지 확인합니다. 사용자 이름 또는 암호에 다음 문자가 포함된 경우 백분율로 인코딩해야 합니다.
: / ? # [ ] @
다음 예는 '#MyP@assword?'를 퍼센트 인코딩하는 방법을 보여줍니다.
console.log(encodeURIComponent('#MyP@assword?'));
이렇게 하면 다음과 같은 결과가 출력됩니다.
"%23MyP%40assword%3F"
사용자가 인증 데이터베이스에 있는지 확인하기
SCRAM-SHA-256
에서 사용자 이름과 암호를 사용하여 연결을 성공적으로 인증하려면 사용자 이름을 인증 데이터베이스에 정의해야 합니다. 기본 인증 데이터베이스는 admin
데이터베이스입니다. 인증에 다른 데이터베이스를 사용하려면 연결 문자열에 authSource
을(를) 지정하세요. 다음 예시에서는 드라이버에 users
을(를) 인증 데이터베이스로 사용하도록 지시합니다.
const { MongoClient } = require("mongodb"); const uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users"; const client = new MongoClient(uri);
메시지 전송 오류
요청을 한 후 드라이버가 명령을 전송하지 못하면 다음과 같은 오류 메시지가 표시될 수 있습니다.
com.mongodb.MongoSocketWriteException: Exception sending message
다음 섹션에서는 잠재적으로 문제를 해결하기 위해 취할 수 있는 조치에 대해 설명합니다.
사용자 권한 확인
올바른 사용자로 MongoDB deployment에 액세스했는지 확인하세요. 오류의 '메시지'라는 용어는 드라이버가 보낸 명령일 수 있습니다. 명령을 보낼 권한이 없는 사용자를 사용하는 경우 드라이버에서 이 오류가 발생할 수 있습니다.
또한 사용자에게 보내는 메시지에 대한 적절한 권한이 있는지 확인하세요. MongoDB는 RBAC(역할 기반 액세스 제어)를 사용하여 MongoDB 배포서버에 대한 액세스를 제어합니다. MongoDB에서 RBAC를 구성하는 방법에 대한 자세한 내용은 기본 MongoDB 포트를 참조하세요.
방화벽 구성
방화벽에는 MongoDB 인스턴스와 통신할 수 있는 개방형 포트가 있어야 합니다. 방화벽 구성 정보는 연결 오류 섹션의 방화벽 구성에서 자세히 확인하세요.
연결 횟수 확인
각 MongoClient
인스턴스는 연결 풀에서 최대 동시 개방 연결 수를 지원합니다. 이 제한을 정의하는 매개변수 maxPoolSize
을(를) 구성할 수 있습니다. 기본값은 100
입니다. maxPoolSize
만큼 열려 있는 연결이 이미 여러 개 있는 경우 서버는 연결을 사용할 수 있을 때까지 기다립니다. 이 대기 시간이 maxIdleTimeMS
값을 초과하면 드라이버는 오류로 응답합니다.
연결 풀링 작동 방식에 대한 자세한 내용은 연결 풀 페이지의 연결 풀 개요 를 참조하세요.
시간 초과 오류
네트워크가 드라이버의 요청을 서버에 충분히 빠르게 전달하지 못하면 타임아웃이 발생할 수 있습니다. 이 경우 다음 메시지와 유사한 오류 메시지가 나타날 수 있습니다.
timed out while checking out a connection from connection pool: context canceled
이 오류가 발생하면 다음 조치를 시도하여 문제를 해결하세요.
연결 제한 시간 설정
연결할 수 없는 복제본 세트 노드에 도달하는 데 시간이 너무 오래 걸려서 연결을 설정할 수 없는 경우 드라이버가 중단될 수 있습니다. connectTimeoutMS
설정을 사용하면 드라이버가 연결을 시도하는 데 소요되는 시간을 제한할 수 있습니다. 이 설정에 대해 자세히 알아보려면 서버 매뉴얼의 시간 초과 옵션 을 참조하세요.
connectTimeoutMS
설정이 해당 세트의 멤버에 대한 최대 네트워크 지연 시간보다 낮지 않은지 확인합니다. 세컨더리 멤버 중 하나의 지연 시간이 10000밀리초인 경우 connectTimeoutMS
를 9000으로 설정하면 드라이버가 해당 멤버에 연결되지 않습니다.
다음 예에서는 connectTimeoutMS
을(를) 10000밀리초로 설정합니다.
const client = new MongoClient(uri, { connectTimeoutMS: 10000, });
작업 실행 중 클라이언트 연결 해제
MongoDB Server 버전 4.2부터 클라이언트 연결이 끊어지면 서버 애그리게이션 및 찾기 작업과 같은 실행 작업을 종료합니다.
쓰기 작업과 같은 다른 작업은 클라이언트 연결이 끊긴 경우에도 MongoDB Server에서 계속 실행됩니다. 이 동작은 클라이언트 연결이 끊어진 후 애플리케이션이 작업을 다시 시도하는 경우 데이터 불일치를 일으킬 수 있습니다.
예기치 않은 네트워크 동작
애플리케이션과 MongoDB 간의 방화벽이 잘못 구성된 경우 예기치 않은 네트워크 동작이 발생할 수 있습니다. 이러한 방화벽은 연결을 제거하는 데 지나치게 공격적일 수 있으며, 이로 인해 예기치 않은 오류가 발생할 수 있습니다.
방화벽이 다음과 같은 동작을 보이는지 확인합니다.
방화벽은 연결을 닫을 때
FIN
패킷을 보내 드라이버에게 소켓이 닫혔음을 알립니다.방화벽은 킵얼라이브 메시지를 허용합니다.
팁
킵얼라이브 메시지에 대해 자세히 학습하려면 연결 옵션 페이지의 킵얼라이브 연결 옵션 섹션을 참조하세요.
복제본 세트에 대한 연결 문자열 오류
운전자 에 전달된 연결 문자열은 복제본 세트 구성에 설정하다 대로 서버에 대해 정확한 호스트 이름을 사용해야 합니다. 복제본 세트 에 대한 다음 구성 설정이 주어졌을 때 복제본 세트 검색 및 페일오버 작동하려면 server1
server2
운전자, 및 server3
에 대한 액세스 있어야 합니다.
{ "_id": "testSet", "version": 1, "protocolVersion": 1, "members": [ { "_id": 1, "host": "server1:31000" }, { "_id": 2, "host": "server2:31001" }, { "_id": 3, "host": "server3:31002" } ] }