Error de conexión de MongoDB: MongoTimeoutError: la selección del servidor expiró después de 30000 ms


11

Estoy tratando de crear una aplicación fullstack leyendo el siguiente tutorial:

https://medium.com/javascript-in-plain-english/full-stack-mongodb-react-node-js-express-js-in-one-simple-app-6cc8ed6de274

Seguí todos los pasos y luego intenté correr:

node server.js

Pero recibí el siguiente error:

Error de conexión de MongoDB: MongoTimeoutError: La selección del servidor expiró después de 30000 ms en Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) en listOnTimeout (interno / timers.js: 531: 17) en processTimers (internal / timers.js: 475: 7) {nombre: 'MongoTimeoutError', razón: Error: conecte ETIMEDOUT 99.80.11.208:27017 en TCPConnectWrap.afterConnect [como oncomplete] (net. js: 1128: 14) {nombre: 'MongoNetworkError', [Símbolo (mongoErrorContextSymbol)]: {}}, [Símbolo (mongoErrorContextSymbol)]: {}} (nodo: 42892) UnhandledPromiseRejectionWarning: MongoTimeoutError: La selección del servidor se agotó después de 30000 ms en Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) en listOnTimeout (internal / timers.js: 531: 17) en processTimers (internal / timers.js: 475: 7)

Mi código en server.js es el siguiente:

const mongoose = require('mongoose');
const router = express.Router();

// this is our MongoDB database
const dbRoute =
    'mongodb+srv://user:<password>@cluster0-3zrv8.mongodb.net/test?retryWrites=true&w=majority';

mongoose.Promise = global.Promise;

// connects our back end code with the database
mongoose.connect(dbRoute, 
    {   useNewUrlParser: true,
        useUnifiedTopology: true
    });

let db = mongoose.connection;

db.once('open', () => console.log('connected to the database'));

¿Alguna sugerencia?


1
¿Cambiaste user:passworda tu username and passwordcadena de conexión?
Shivam Sood

@ShivamSood Sí, lo hice
Arvind Krmar

Para agregar a la información, traté de conectarme usando la comunidad de brújula MongoDB pero me dio el mismo error. ¿Pueden ser algunos ajustes en atLas Mongodb?
Arvind Krmar

2
La aplicación funciona bien con MongoDB local "mongodb: //127.0.0.1/FullStack". Parece que la conectividad al atlas MongoDB es el problema.
Arvind Krmar

1
Soy capaz de resolverlo. El cortafuegos estaba bloqueando el acceso, lo mismo podría probarse con esto: portquiz.net:27017
Arvind Krmar

Respuestas:


25

simplemente vaya al panel de administración de mongodb atlas. Vaya a la pestaña de seguridad> Acceso a la red> Luego agregue su IP a la lista blanca agregándola

Vea esta imagen para ubicar el menú en particular

Nota: Verifique su IP en Google y luego agréguela


2
Hizo eso, pero no tuve suerte. Más bien
permití

hermano, ¿ha configurado correctamente la configuración de la base de datos
kunal usapkar

He creado roles para acceso db: nombre de usuario: arvind Método de autenticación: SCRAM MongoDBRoles: atlasAdmin @ admin ¿Necesito crear algo en el clúster o 'Data Lake'?
Arvind Krmar

capaz de resolverlo, todo estaba correcto, pero el cortafuegos estaba bloqueando el acceso al puerto 27017. Puede probarlo aquí: portquiz.net:27017
Arvind Krmar el


6

Asegúrese de eliminar "<" y ">" cuando reemplace los campos de usuario y contraseña. Esto funciono para mi


3

A veces, este error se produce debido a que la dirección IP tiene acceso a nuestra base de datos.

Eso sí, su aplicación puede estar funcionando bien y luego aparece ese error. Cada vez que esto sucede, la mayoría de las veces sus direcciones IP han cambiado, lo que no está en la lista blanca de direcciones permitidas.

Todo lo que tiene que hacer es actualizar la lista blanca con sus direcciones IP actuales


2

Incluya en la lista blanca su dirección IP de conexión. Atlas solo permite conexiones de clientes al clúster desde las entradas en la lista blanca del proyecto. La lista blanca del proyecto es distinta de la lista blanca de la API, que restringe el acceso de la API a direcciones IP o CIDR específicas.

NOTA

Puede omitir este paso si Atlas indica en el paso Configuración de seguridad de conexión que ya ha configurado una entrada de la lista blanca en su clúster. Para administrar la lista blanca de IP, consulte Agregar entradas a la lista blanca.

Si la lista blanca está vacía, Atlas le solicita que agregue una dirección IP a la lista blanca del proyecto. Tu también puedes:

Haga clic en Agregar su dirección IP actual para incluir en la lista blanca su dirección IP actual.

Haga clic en Agregar una dirección IP diferente para agregar una sola dirección IP o un rango de direcciones con notación CIDR.

Para los clústeres de Atlas implementados en Amazon Web Services (AWS) y que utilizan VPC Peering, puede agregar un grupo de seguridad asociado con la VPC de igual.

Puede proporcionar una descripción opcional para la dirección IP o el rango CIDR recién agregados. Haga clic en Agregar dirección IP para agregar la dirección a la lista blanca.


1

¡Puede eliminar la bandera {useUnifiedTopology: true} y reinstalar la dependencia de la mangosta! Funcionó para mí.


da el siguiente error cuando se elimina {useUnifiedTopology: true}: (nodo: 10020) DeprecationWarning: el motor actual de detección y supervisión del servidor está en desuso y se eliminará en una versión futura. Para usar el nuevo motor de Descubrimiento y monitoreo del servidor, pase la opción {useUnifiedTopology: true} al constructor MongoClient.
Arvind Krmar

1

Tengo el mismo error. Estos son los pasos que seguí para resolverlo

  1. Vaya a la pestaña de seguridad -> Acceso a la red -> Luego ponga en la lista blanca su IP
  2. Luego vaya a la pestaña de seguridad -> Acceso a la base de datos -> y elimine su usuario actual.
  3. Cree un nuevo usuario proporcionando un nuevo nombre de usuario y contraseña.
  4. Proporcione ese nombre de usuario y contraseña recién creados en el archivo .env o en el método mongoose.connect

Después de estos pasos funcionó como siempre. Espero que esto los ayude.


0

Puedes probar:

// Import express
let express = require('express');
// Import Body parser
let bodyParser = require('body-parser');
// Import Mongoose
let mongoose = require('mongoose');
// Initialize the app
let app = express();

// Import routes
let apiRoutes = require("./api-routes");
// Configure bodyparser to handle post requests
app.use(bodyParser.urlencoded({
    extended: true
}));
app.use(bodyParser.json());

// Connect to Mongoose and set connection variable
mongoose.connect('mongodb://XXXX:XXXX@cluster0-shard-00-00-ov74c.mongodb.net:27017,cluster0-shard-00-01-ov74c.mongodb.net:27017,cluster0-shard-00-02-ov74c.mongodb.net:27017/test?ssl=true&replicaSet=Cluster0-shard-0&authSource=admin&retryWrites=true&w=majority', {useNewUrlParser: true})
    .then(()=>console.log("DB server connect"))
    .catch(e => console.log("DB error", e));


var db = mongoose.connection;

// Added check for DB connection

if(!db)
    console.log("Error connecting db")
else
    console.log("Db connected successfully")

// Setup server port
var port = process.env.PORT || 8080;

// Send message for default URL
app.get('/', (req, res) => res.send('Hello World with Express'));

// Use Api routes in the App
app.use('/api', apiRoutes);
// Launch app to listen to specified port
app.listen(port, function () {
    console.log("Running RestHub on port " + port);
});

@ArvindKrmar si ha iniciado sesión en el sitio web mongo? Usted eligió la versión node 3.00 or latery copió `` mongodb + srv: // usuario: <contraseña> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = verdadero & w = mayoría ''? Allí tiene tres opciones para elegir, elija el nodo medio
Umbro, el

Seleccioné el nodo "Conectar su aplicación" y copié la cadena de conexión anterior, reemplazando la contraseña, sin embargo, no estoy seguro de qué contraseña debería ser, la contraseña con la que inicié sesión en atlast MongoDB o algo más. Estoy tratando de averiguarlo
Arvind Krmar, el

@ArvindKrmar proporcionó una contraseña de base de datos separada
Umbro

Creé dos usuarios en la sección "Acceso a la base de datos" y mantuve la misma contraseña que usé para iniciar sesión en mongoDB para mantenerla segura por el bien o dejar que la aplicación comience a ejecutarse, pero hasta ahora no tuve suerte.
Arvind Krmar

1
El código funciona cuando uso localhost "mongodb: //127.0.0.1/FullStack". Entonces, ciertamente, la conectividad al atlas MongoDB tiene algún problema.
Arvind Krmar el

0

tuve este problema, para mí la solución fue verificar si mi ip se configuró correctamente y antes de confirmar en esta pantalla

ingrese la descripción de la imagen aquí


1
Encontré la solución. El problema estaba en la configuración del firewall en mi sistema de red. portquiz.net:27017 se puede usar para probar si la conexión se ha realizado. Aunque no cambié el cortafuegos, ya que es administrado por los administradores de red en mi extremo, pero una vez que el cortafuegos corrigió su funcionamiento ahora. Gracias a todos por las sugerencias.
Arvind Krmar

0

Por favor Compruebe su contraseña, la configuración del nombre de usuario o IP . La mayoría de las veces "La selección del servidor agotó el tiempo de espera después de 30000 ms en Timeout._onTimeout" siempre que las cosas anteriores no coinciden con la configuración de su servidor.


fue un problema de firewall a mi fin. Lo corregí y ahora funciona
Arvind Krmar, el

0

Soy capaz de resolver el problema. Todo estaba bien, pero el firewall estaba bloqueando el acceso al puerto 27017. La conectividad se puede probar en http://portquiz.net:27017/ o usando telnet hasta el punto final que se puede recuperar de clústeres-> Métricas.

Gracias a todos por las sugerencias.


0

Intente crear un nuevo usuario en el acceso a la base de datos con el método de autenticación predeterminado que es "SCRAM". Luego crea un nuevo Clúster para eso. ¡Funcionó para mí! Mi archivo server.js

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;

app.use(cors());
app.use(express.json());

//const uri = process.env.ATLAS_URI;
mongoose.createConnection("mongodb+srv://u1:u1@cluster0-u3zl8.mongodb.net/test", { userNewParser: true, useCreateIndex: true,  useUnifiedTopology: true}
    );

const connection = mongoose.connection;
connection.once('once', () => {
    console.log(`MongoDB databse connection established successfully`);
})

app.listen(port, () => {
    console.log(`Server is running on port: ${port}`);
});

0

¿Cuál es tu versión de mangosta? porque hay un problema con cierta versión de mangosta. Visite este enlace para obtener más detalles " https://github.com/Automattic/mongoose/issues/8180 ". De todos modos, me enfrentaba al mismo problema, pero después de usar una versión anterior (5.5.2), funcionó para mí. Por favor, inténtalo y avísame qué pasó.


Me encontraba con el mismo problema, sin embargo, con frecuencia desarrollo con mi VPN activada y desactivada. Al encender mi VPN nuevamente, logré conectarme a la base de datos. Espero que este problema sea temporal, porque no siempre puedo tener mi VPN encendida.
Mike K

0

Básicamente podría deberse a una actualización de npm. Acabo de actualizar a npm v 6.13.7. y comencé a tener ese error.

Siguiendo las instrucciones de @Matheus, comenté la línea "{useUnifiedTopology: true}" y pude superarla.

Actualicé mangosta y todo funciona bien.


0

¿Está utilizando algún antivirus, firewall, VPN o en la red restringida (por ejemplo, conexión de trabajo / comercial Wi-Fi / LAN)? Luego intente apagarlo / volver a conectarlo a una red diferente. El administrador de una red que está utilizando puede bloquear algunas IP / conexiones o simplemente el antivirus puede tener políticas de firewall. Aunque si tienes 0.0.0.0en tu IP Addressen el Atlas MongoDB.


0

Tuve el mismo problema. Podía conectarme desde MongoDB Compass o mi aplicación Node usando las cadenas de conexión que Atlas me dio. Lo resolví agregando mi dirección IP a la lista blanca en Atlas.


0

Para cualquiera que todavía esté luchando por este problema. Resolví este problema estableciendo todos los parámetros como nombre de usuario, contraseña y dbName en las propias opciones de mangosta.

Anteriormente el código era así. (Cuando recibía el error).

import mongoose from "mongoose";
mongoose.Promise = require("bluebird");

let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
if(!dbName || !dbAddress || !dbPort){
    throw new Error("Mongo error unable to configuredatabase");
}

let options = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    user:process.env.DB_USER,
    pass: process.env.DB_PASS
};

mongoose.connect(`mongodb://${dbAddress}:${dbPort}/${dbName}`, options).catch(err => {
    if (err.message.indexOf("ECONNREFUSED") !== -1) {
        console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
        process.exit(1);
    } else {
        throw err;
    }
});

Tenga en cuenta que url en mongo connect. mongodb://${dbAddress}:${dbPort}/${dbName}.

Nuevo código sin error.

import mongoose from "mongoose";
mongoose.Promise = require("bluebird");

let dbName = process.env.DB_NAME;
const dbAddress = process.env.DB_HOST;
const dbPort = process.env.DB_PORT;
// console.log("process.env", process.env)
if(!dbName || !dbAddress || !dbPort){
    throw new Error("Mongo error unable to configuredatabase");
}

let options = {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    user:process.env.DB_USER,
    pass: process.env.DB_PASS,
    dbName: dbName
};

mongoose.connect(`mongodb://${dbAddress}:${dbPort}`, options).catch(err => {
    if (err.message.indexOf("ECONNREFUSED") !== -1) {
        console.error("Error: The server was not able to reach MongoDB. Maybe it's not running?");
        process.exit(1);
    } else {
        throw err;
    }
});

Tenga en cuenta las opciones y la url.

Este es mi entorno local. No producción env.

Espero que sea útil.


0

intente especificar el controlador de nodo, versión 2,2,12 en el clúster -> conectar -> conecte su aplicación. la nueva cadena debe estar con mongodb: //. usa esta cadena para conectarte. no olvides ingresar una contraseña

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.