Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

Solución de problemas de conexión

Esta página ofrece posibles soluciones a los problemas que puede encontrar al utilizar el controlador MongoDB Node.js para conectarse a una implementación de MongoDB.

Nota

Esta página solo aborda problemas de conexión. Si tiene algún otro problema con MongoDB o el controlador, visite los siguientes recursos:

  • La Página deproblemas y ayuda, que contiene información sobre cómo informar errores, contribuir al controlador y encontrar más recursos

  • El MongoDB Etiqueta Stack Overflow o la comunidad MongoDB Reddit para preguntas, debates o soporte técnico general

Si el driver no puede conectarse al host especificado, podrías obtener un MongoServerSelectionError.

Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.

Verifique que los puertos que escucha su implementación de MongoDB no estén bloqueados por un firewall en la misma red. MongoDB usa el puerto 27017 por defecto. Para obtener más información sobre los puertos predeterminados que usa MongoDB y cómo cambiarlos, consulte "Puerto predeterminado de MongoDB" en el manual del servidor MongoDB.

Advertencia

No abra un puerto en su firewall a menos que esté seguro de que es el puerto utilizado por su implementación de MongoDB.

Verifica que tu dirección IP esté incluida en la Lista de Acceso IP para tu clúster. Puede encontrar su lista de acceso IP en la sección Acceso a la red de la interfaz de usuario Atlas. Para saber más sobre cómo configurar la Lista de acceso IP, consulta la guía Configurar entradas en la Lista de Acceso IP en la documentación de Atlas.

Si la conexión se rechaza cuando el driver intenta conectarse a la instancia de MongoDB, genera un mensaje de error similar al siguiente:

MongoServerSelectionError: connect ECONNREFUSED <IPv6 address>:<port>

Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.

En Node.js v17 y versiones posteriores, el solucionador DNS usa IPv6 por defecto cuando tanto el cliente como el host admiten ambos. Por ejemplo, si MongoDB usa IPv4 y el cliente usa IPv6, el controlador devuelve el mensaje de error anterior.

Puedes configurar tu implementación de MongoDB para usar el modo IPv6 al comenzar con mongod o mongos. Para obtener más información sobre cómo especificar el modo IPv6, consulta IP Binding en el manual del servidor.

Como alternativa, puede utilizar explícitamente IPv4 con su cliente especificando family: 4 como una opción para su MongoClient.

const client = new MongoClient(uri, {
family: 4,
});

Si la conexión se restablece cuando el controlador llama a client.connect(), genera un mensaje de error similar al siguiente:

MongoServerSelectionError: connect ECONNRESET ::<IP address>:<port>

La siguiente sección describe un método que podría ayudar a resolver el problema.

Un descriptor de archivo es un identificador único asociado a un proceso abierto. En la mayoría de los sistemas operativos, cada conexión abierta desde el controlador está asociada con un descriptor de archivo. Los sistemas operativos suelen tener un límite en la cantidad de descriptores de archivos que puede utilizar un solo proceso. Se puede producir un error de ECONNRESET si el número de conexiones supera este límite.

Puedes establecer el número máximo de conexiones configurando maxPoolSize. Para resolver este error, puedes disminuir el número máximo de conexiones permitidas estableciendo el valor de maxPoolSize. Como alternativa, puedes aumentar el límite de descriptores de archivos en tu sistema operativo. Para obtener más información sobre cómo configurar maxPoolSize, consulte la documentación de la API para maxPoolSize .

Advertencia

Siempre ten cuidado al cambiar la configuración de tu sistema operativo.

El controlador de Node.js puede fallar al conectarse a una instancia de MongoDB si la autorización no está configurada correctamente. Si usa SCRAM-SHA-256 para la autenticación y el controlador no se conecta, podría generar un mensaje de error similar a uno de los siguientes:

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.

Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.

Una cadena de conexión inválida es la causa más común de problemas de autenticación cuando se intenta conectar a MongoDB usando SCRAM-SHA-256.

Tip

Para obtener más información sobre las cadenas de conexión, consulta la sección URI de conexión en la Guía de conexión.

Si la cadena de conexión contiene un nombre de usuario y una contraseña, asegúrate de que estén en el formato correcto. Si el nombre de usuario o la contraseña incluye alguno de los siguientes caracteres, deben estar codificados en porcentaje:

: / ? # [ ] @

El siguiente ejemplo muestra cómo codificar por porcentaje "#MyP@assword?":

console.log(encodeURIComponent('#MyP@assword?'));

Esto da como resultado el siguiente resultado:

"%23MyP%40assword%3F"

Para autenticar correctamente una conexión mediante un nombre de usuario y contraseña con SCRAM-SHA-256, el nombre de usuario debe estar definido en la base de datos de autenticación. La base de datos de autenticación por defecto es la base de datos admin. Para utilizar una base de datos diferente para la autenticación, especifica la authSource en la cadena de conexión. El siguiente ejemplo indica al controlador que utilice users como la base de datos de autenticación:

const { MongoClient } = require("mongodb");
const uri = "mongodb://<db_username>:<db_password>@<hostname>:<port>/?authSource=users";
const client = new MongoClient(uri);

Cuando el controlador no logra enviar una orden después de que hayas realizado una solicitud, puede mostrar el siguiente mensaje de error:

com.mongodb.MongoSocketWriteException: Exception sending message

Las siguientes secciones describen acciones que puedes tomar para potencialmente resolver el problema.

Verifica que hayas accedido a la implementación de MongoDB con el usuario correcto. El término 'mensaje' en el error puede ser un comando enviado por el controlador. Si estás usando un usuario que no tiene permisos para enviar el comando, el controlador podría generar este error.

También asegúrate de que el usuario tenga los permisos adecuados para el mensaje que estás enviando. MongoDB utiliza el control de acceso basado en roles (RBAC) para controlar el acceso a una implementación de MongoDB. Para obtener más información sobre cómo configurar el RBAC en MongoDB, consulta Puerto por defecto de MongoDB.

El firewall debe tener un puerto abierto para comunicarse con la instancia de MongoDB. Para obtener más información sobre la configuración del firewall,consulte "Configurar el firewall" en la sección "Error de conexión".

Cada instancia de MongoClient admite un número máximo de conexiones simultáneas abiertas en su pool de conexiones. Se puede configurar el parámetro maxPoolSize que define este límite. El valor por defecto es 100. Si ya hay un número de conexiones abiertas igual a maxPoolSize, el servidor espera hasta que una conexión esté disponible. Si este tiempo de espera supera el valor de maxIdleTimeMS, el controlador responde con un error.

Para más información sobre cómo funciona la agrupación de conexiones, consulte la Descripción general de pool de conexiones en la página Pools de conexiones.

Cuando la red no puede entregar una solicitud del driver al servidor lo suficientemente rápido, puede agotar el tiempo de espera. Cuando esto ocurre, puedes recibir un mensaje de error similar al siguiente mensaje:

timed out while checking out a connection from connection pool: context canceled

Si recibes este error, intenta la siguiente acción para solucionar el problema.

El driver puede bloquearse cuando no puede establecer una conexión porque tarda demasiado tiempo intentando llegar a nodos inalcanzables del set de réplicas. Puede limitar el tiempo que el controlador pasa intentando establecer la conexión mediante la configuración connectTimeoutMS. Para saber más sobre este ajuste, consulta las Opciones de tiempo de espera en el manual del servidor.

Asegúrate de que la configuración connectTimeoutMS no sea inferior a la mayor latencia de red que tengas para un nodo del set. Si uno de los nodos secundarios tiene una latencia de 10000 milisegundos, configurar el connectTimeoutMS en 9000 evita que el driver se conecte nunca a ese nodo.

El siguiente ejemplo establece connectTimeoutMS en 10000 milisegundos.

const client = new MongoClient(uri, {
connectTimeoutMS: 10000,
});

A partir de la versión 4.2 de MongoDB Server, el servidor termina las operaciones en curso, como agregaciones y operaciones de búsqueda, si el cliente se desconecta.

Otras operaciones, como las operaciones de guardar, continúan ejecutándose en el MongoDB Server incluso si el cliente se desconecta. Este comportamiento puede causar inconsistencias en los datos si tu aplicación vuelve a intentar la operación después de que el cliente se desconecte.

Podrías experimentar un comportamiento inesperado de la red si el firewall entre tu aplicación y MongoDB está mal configurado. Estos firewalls pueden ser demasiado agresivos al eliminar conexiones, lo que puede provocar errores inesperados.

Confirme que su firewall muestra el siguiente comportamiento:

  • El firewall envía un paquete FIN al cerrar una conexión, informando al controlador que el socket está cerrado.

  • El firewall permite mensajes keepalive.

Tip

Para aprender más sobre los mensajes de keepalive, consulta la sección keepAlive Connection Option en la página Connection Options.

La cadena de conexión que pasa al driver debe emplear los nombres de host exactos de los servidores, tal como se indican en la configuración del set de réplicas. Dadas las siguientes configuraciones del set de réplicas, para que el descubrimiento del set de réplicas y la conmutación por error funcionen, el driver debe tener acceso a server1, server2 y server3.

{
"_id": "testSet",
"version": 1,
"protocolVersion": 1,
"members": [
{
"_id": 1,
"host": "server1:31000"
},
{
"_id": 2,
"host": "server2:31001"
},
{
"_id": 3,
"host": "server3:31002"
}
]
}

Volver

Elija un destino de conexión