Solução de problemas de conexão
Nesta página
- Erro de conexão
- Verifique sua connection string
- Configurar firewall
- Erro ECONNREFUSED
- Certifique-se de que o MongoDB e seu cliente usem o mesmo protocolo
- Erro de ECONNRESET
- Controle o número de descritores de arquivos
- Erro de autenticação
- Verifique sua connection string
- Verificar se o usuário está no banco de dados de autenticação
- Erro ao enviar mensagem
- Verifique as permissões do usuário
- Configurar firewall
- Verifique o número de conexões
- Muitas conexões abertas
- Verifique o número de conexões
- Erro de tempo limite
- Definir connectTimeoutMS
- Verifique o número de conexões
Esta página oferece soluções potenciais para problemas que você pode encontrar ao usar o driver MongoDB Node.js para se conectar a uma implantação do MongoDB.
Observação
Esta página aborda apenas problemas de conexão. Se você encontrar qualquer outro problema com o MongoDB ou com o driver, acesse os seguintes recursos:
As Perguntas frequentes (FAQ) para o driver do Node.js
A página Problemas e ajuda, que contém informações sobre como reportar bugs, contribuir com o driver e encontrar recursos adicionais
Os Fóruns da MongoDB Community para perguntas, discussões ou suporte técnico geral
Erro de conexão
A seguinte mensagem de erro indica que o driver não pode se conectar a um servidor no nome de host ou porta especificada. Várias situações podem gerar essa mensagem de erro. Nesta mensagem de erro de exemplo, o nome do host é 127.0.0.1
e a porta é 27017
:
Error: couldn't connect to server 127.0.0.1:27017
As seções a seguir descrevem ações que você pode adotar para resolver o problema.
Verifique sua connection string
Verifique se o nome do host e o número da porta na connection string são precisos. O valor de porta padrão para uma instância do MongoDB é 27017
, mas você pode configurar o MongoDB para se comunicar em outra porta.
Configurar firewall
Verifique se as portas nas quais sua implantação MongoDB escuta não estão bloqueadas por um firewall na mesma rede. O MongoDB usa a porta 27017
por padrão. Para saber mais sobre as portas padrão que o MongoDB usa e como alterá-las, consulte Porta padrão do MongoDB.
Aviso
Não abra uma porta no firewall, a menos que tenha certeza de que é a porta usada pelo MongoDB deployment.
Erro ECONNREFUSED
Se a conexão for recusada quando o driver tentar se conectar à instância do MongoDB, ele gerará esta mensagem de erro:
MongoServerSelectionError: connect ECONNREFUSED <IPv6 address>:<port>
As seções a seguir descrevem ações que você pode adotar para resolver o problema.
Certifique-se de que o MongoDB e seu cliente usem o mesmo protocolo
No Node.js v17 e versões posteriores, o resolvedor DNS usa IPv6
por padrão se o cliente e o host oferecem suporte a ambos. Por exemplo, se o MongoDB usar IPv4 e seu cliente usar IPv6, o driver gerará a mensagem de erro anterior.
Você pode configurar sua implantação do MongoDB para usar o modo IPv6
ao iniciar com mongod
ou mongos
. Para obter mais informações sobre como especificar o modo IPv6
, consulte Vinculação de IP no manual do servidor.
Você também pode usar o IPv4
com seu cliente especificando o family: 4
como uma opção para seu MongoClient.
const client = new MongoClient(uri, { family: 4, });
Erro de ECONNRESET
Se a conexão for reiniciada quando o driver chamar client.connect()
, ele gerará esta mensagem de erro:
MongoServerSelectionError: connect ECONNRESET ::<IP address>:<port>
A seção a seguir descreve um método que pode ajudar a resolver o problema.
Controle o número de descritores de arquivos
Um descritor de arquivo é um identificador único associado a um processo aberto. Na maioria dos sistemas operacionais, cada conexão aberta do driver é associada a um descritor de arquivos. Os sistemas operacionais normalmente têm um limite de número de descritores de arquivos usados por um único processo. Um erro ECONNRESET
poderá ocorrer se o número de conexões exceder esse limite.
Você pode definir o número máximo de conexões configurando maxPoolSize
. Para solucionar este erro, você pode diminuir o número máximo de conexões permitidas configurando o valor de maxPoolSize
. Como alternativa, você pode aumentar o limite do descritor de arquivos em seu sistema operacional.
Aviso
A alteração da configuração do seu sistema operacional deve sempre ser feita com cautela.
Erro de autenticação
O driver do Node.js pode falhar ao conectar a uma instância do MongoDB se a autorização não estiver configurada corretamente. Se você estiver usando SCRAM-SHA-256
para fazer autenticação e o driver conecta, o driver poderá gerar uma mensagem de erro semelhante a uma das seguintes mensagens:
Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server <hostname>:<port>.
connection() error occurred during connection handshake: auth error: sasl conversation error: unable to authenticate using mechanism "SCRAM-SHA-256": (AuthenticationFailed) Authentication failed.
As seções a seguir descrevem ações que você pode adotar para resolver o problema.
Verifique sua connection string
Uma connection string inválida é a causa mais comum de problemas de autenticação ao tentar se conectar ao MongoDB usando SCRAM-SHA-256
.
Dica
Para obter mais informações sobre connection strings, consulte URI de conexão no Guia de conexão.
Se sua string de conexão contiver um nome de usuário e senha, certifique-se de que eles estejam no formato correto. Se o nome de usuário ou senha incluir qualquer um dos seguintes caracteres, eles devem usar codificação percentual:
: / ? # [ ] @
O exemplo abaixo mostra como codificar a porcentagem de "#MyP@assword?":
console.log(encodeURIComponent('#MyP@assword?'));
Isso resulta na seguinte saída:
"%23MyP%40assword%3F"
Verificar se o usuário está no banco de dados de autenticação
Para autenticar uma conexão corretamente usando um nome de usuário e uma senha com SCRAM-SHA-256
, o nome de usuário deve ser definido no banco de dados de autenticação. O banco de dados de autenticação padrão é o banco de dados admin
. Para usar outro banco de dados de autenticação, especifique o authSource
na connection string. O exemplo abaixo orienta o driver a usar o users
como banco de dados de autenticação:
const { MongoClient } = require("mongodb"); const uri = "mongodb://<username>:<password>@<hostname>:<port>/?authSource=users"; const client = new MongoClient(uri);
Você pode verificar se este é o problema tentando se conectar a uma instância do MongoDB hospedada na máquina local com o mesmo código. Um sistema na mesma máquina não exige qualquer autorização para se conectar.
Erro ao enviar mensagem
Quando o driver não envia um comando após você fazer uma solicitação, ele pode exibir a seguinte mensagem de erro:
com.mongodb.MongoSocketWriteException: Exception sending message
As seções a seguir descrevem ações que você pode adotar para resolver o problema.
Verifique as permissões do usuário
Verifique se você acessou o MongoDB deployment com o usuário correto. O termo "mensagem" no erro pode ser um comando enviado pelo driver. Se você estiver usando um usuário que não tem permissões para enviar o comando, o driver poderá gerar esse erro.
Certifique-se também de que o usuário tenha as permissões apropriadas para a mensagem que você está enviando. O MongoDB usa o RBAC (controle de acesso baseado em funções) para controlar o acesso a uma implantação MongoDB. Para obter mais informações sobre como configurar o RBAC no MongoDB, consulte Porta padrão do MongoDB.
Configurar firewall
O firewall precisa ter uma porta aberta para se comunicar com a instância do MongoDB. Para obter mais informações sobre como configurar o firewall, consulte Configurar firewall na seção Erro de conexão.
Verifique o número de conexões
Cada instância do MongoClient
aceita um número máximo de conexões abertas simultâneas em seu pool de conexões. Você pode configurar o parâmetro maxPoolSize
que define esse limite. O valor padrão é 100
. Se já houver uma série de conexões abertas iguais a maxPoolSize
, o servidor aguardará até que uma conexão se torne disponível. Se esse tempo de espera exceder o valor de maxIdleTimeMS
, o driver responderá com um erro.
Para obter mais informações sobre como funciona o pool de conexões, consulte Como funciona o pool de conexões no driver de nó? na seção de Perguntas frequentes.
Muitas conexões abertas
O driver cria a seguinte mensagem de erro quando tenta abrir uma conexão, mas atingiu o número máximo de conexões:
connection refused because too many open connections
A seção a seguir descreve um método que pode ajudar a resolver o problema.
Verifique o número de conexões
Para criar mais conexões abertas, aumente o valor de maxPoolSize
. Para obter mais informações sobre como verificar o número de conexões, consulte Verifique o número de conexões na seção Erro ao enviar mensagem.
Erro de tempo limite
Quando a rede não é capaz de entregar uma solicitação do driver para o servidor com rapidez suficiente, ela pode expirar. Quando isso acontece, você pode receber uma mensagem de erro semelhante à seguinte:
timed out while checking out a connection from connection pool: context canceled
Se você receber esse erro, tente a seguinte ação para resolver o problema.
Definir connectTimeoutMS
O driver pode travar quando não consegue estabelecer uma conexão porque leva muito tempo tentando alcançar nós de conjuntos de réplicas inacessíveis. Você pode limitar o tempo que o driver gasta tentando estabelecer a conexão utilizando a configuração connectTimeMS
. Para saber mais sobre essa configuração, consulte as Opções de tempo limite no manual do servidor.
Você deve garantir que a configuração do connectTimeoutMS
não seja menor que a latência de rede mais alta que você tem para um nó do conjunto. Se um dos secundários tiver uma latência de 10.000 milissegundos, definir o connectTimeoutMS
para 9.000 impede que o driver se conecte a esse nó.
O exemplo a seguir define connectTimeoutMS
em 10.000 milissegundos.
const client = new MongoClient(uri, { connectTimeoutMS: 10000, });
Verifique o número de conexões
O número de conexões com o servidor pode exceder maxPoolSize
. Para obter mais informações sobre como verificar o número de conexões, consulte Verificar o número de conexões na seção Mensagem de erro de envios.