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:
A páginaProblemas e ajuda do , que contém informações sobre como relatar bugs, contribuir para o driver e encontrar mais recursos
Os fóruns da MongoDB Community para perguntas, discussões ou suporte técnico geral
Erro de conexão
Se o driver não puder se conectar ao host especificado, você poderá obter um MongoServerSelectionError
.
As seções a seguir descrevem ações que você pode adotar para resolver o problema.
Configurar firewall
Verifique se as portas nas quais seu MongoDB deployment 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 no manual do MongoDB Server.
Aviso
Não abra uma porta no firewall, a menos que tenha certeza de que é a porta usada pelo MongoDB deployment.
Verifique sua lista de acesso à rede
Verifique se o seu endereço IP está listado na lista de acesso IP do cluster. Você pode encontrar sua lista de acesso IP na seção Acesso à rede da UI do Atlas . Para saber mais sobre como configurar sua lista de acesso IP, consulte o guia Configurar entradas da lista de acesso IP na documentação do Atlas.
Erro ECONNREFUSED
Se a conexão for recusada quando o driver tentar se conectar à instância do MongoDB , ele gerará uma mensagem de erro semelhante à seguinte:
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 endereço IP
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á uma mensagem de erro semelhante à seguinte:
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.
Para definir o número máximo de conexões, configure 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. Para saber mais sobre como definir o maxPoolSize
, consulte a documentação API para maxPoolSize .
Aviso
Sempre tenha cuidado ao alterar a configuração do seu sistema operacional.
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:
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.
As seções a seguir descrevem ações que você pode adotar para resolver o problema.
Verifique sua connection string
Uma string de conexão inválida é a causa mais comum de problemas de autenticação quando você tenta se conectar ao MongoDB usando SCRAM-SHA-256
.
Dica
Para obter mais informações sobre connection strings, consulte a seção 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://<db_username>:<db_password>@<hostname>:<port>/?authSource=users"; const client = new MongoClient(uri);
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 o pool de conexões funciona, consulte a Visão geral do pool de conexões na página Pools de conexões.
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 connectTimeoutMS
. Para saber mais sobre essa configuração, consulte as Opções de tempo limite no manual do servidor.
Verifique se a configuração de connectTimeoutMS
não é menor do que a latência de rede mais alta que você tem para um membro do conjunto. Se um dos membros secundários tiver uma latência de 10000 milissegundos, definir o connectTimeoutMS
como 9000 impede que o driver se conecte a esse membro.
O exemplo a seguir define connectTimeoutMS
em 10.000 milissegundos.
const client = new MongoClient(uri, { connectTimeoutMS: 10000, });
Desconexão do cliente durante a execução da operação
A partir da versão 4.2 do MongoDB Server , o servidor encerra as operações em execução, como agregações e operações de localização, se o cliente se desconectar.
Outras operações, como operações de gravação, continuam a ser executadas no MongoDB Server mesmo se o cliente se desconectar. Esse comportamento pode causar inconsistências de dados se seu aplicativo tenta novamente a operação depois que o cliente se desconecta.
Comportamento de rede inesperado
Você pode experimentar um comportamento inesperado na rede se o firewall entre seu aplicativo e o MongoDB estiver configurado incorretamente. Esses firewalls podem ser excessivamente agressivos na remoção de conexões, o que pode causar erros inesperados.
Confirme se o firewall exibe o seguinte comportamento:
O firewall envia um pacote
FIN
ao fechar uma conexão, informando ao driver que o soquete está fechado.O firewall permite a manutenção de atividade de mensagens.
Dica
Para saber mais sobre mensagens keepalive, consulte a seção Opção de conexão keepalive na página Opções de conexão.
Erros de connection string para conjuntos de réplicas
A string de conexão passada para o driver deve usar nomes de host exatos para os servidores, conforme definido na configuração do conjunto de réplicas. Dadas as seguintes definições de configuração para seu conjunto de réplicas, para que a descoberta e o failover do conjunto de réplicas funcionem, o driver deve ter acesso a server1
, server2
e server3
.
{ "_id": "testSet", "version": 1, "protocolVersion": 1, "members": [ { "_id": 1, "host": "server1:31000" }, { "_id": 2, "host": "server2:31001" }, { "_id": 3, "host": "server3:31002" } ] }