Join us Sept 17 at .local NYC! Use code WEB50 to save 50% on tickets. Learn more >
MongoDB Event
Menu Docs
Página inicial do Docs
/ / /
Controlador Node.js
/

Solução de problemas de conexão

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

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.

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 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.

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.

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,
});

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.

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.

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.

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"

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);

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 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.

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.

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.

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.

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,
});

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.

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.

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"
}
]
}

Voltar

Conecte-se com o Amazon Web Services Lambda