Erreur de connexion MongoDB: MongoTimeoutError: la sélection du serveur a expiré après 30000 ms

11

J'essaie de créer une application fullstack en lisant le tutoriel suivant:

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

J'ai suivi toutes les étapes, puis j'ai essayé d'exécuter:

node server.js

Mais j'ai eu l'erreur suivante:

Erreur de connexion MongoDB: MongoTimeoutError: la sélection du serveur a expiré après 30000 ms à Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) à listOnTimeout (internal / timers.js: 531: 17) at processTimers (internal / timers.js: 475: 7) {nom: 'MongoTimeoutError', raison: Erreur: connectez ETIMEDOUT 99.80.11.208:27017 sur TCPConnectWrap.afterConnect [as oncomplete] (net. js: 1128: 14) {name: 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (node: 42892) UnhandledPromiseRejectionWarning: MongoTimeoutError: 300 ms Server selection à Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) sur listOnTimeout (internal / timers.js: 531: 17) sur processTimers (internal / timers.js: 475: 7)

Mon code sur server.js est le suivant:

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

Aucune suggestion?

Arvind Krmar
la source
1
Avez-vous changé user:passwordvotre username and passwordchaîne de connexion?
Shivam Sood du
@ShivamSood Oui, je l'ai fait
Arvind Krmar
Pour ajouter aux informations, j'ai essayé de me connecter en utilisant la communauté de boussoles MongoDB mais cela a donné la même erreur. Peut-il y avoir des paramètres chez atLas Mongodb?
Arvind Krmar
2
l'application fonctionne bien avec MongoDB local "mongodb: //127.0.0.1/FullStack". Apparaît la connectivité à l'atlas MongoDB est le problème.
Arvind Krmar
1
Je suis capable de le résoudre. Le pare-feu bloquait l'accès, la même chose pourrait être testée avec ceci: portquiz.net:27017
Arvind Krmar

Réponses:

25

allez simplement dans le panneau d'administration de mongodb atlas.Allez dans l'onglet sécurité> Accès réseau> Puis ajoutez votre IP à la liste blanche en l'ajoutant

Voir cette image pour localiser le menu particulier

Remarque: vérifiez votre adresse IP sur Google, puis ajoutez-la

kunal usapkar
la source
2
A fait ça, mais pas de chance. Au contraire,
j'autorisais
bro, avez-vous mis en place la configuration DB correctement
kunal usapkar
J'ai créé des rôles pour l'accès à la base de données: nom d'utilisateur: arvind Méthode d'authentification: SCRAM MongoDBRoles: atlasAdmin @ admin Dois-je créer quelque chose dans un cluster ou «Data Lake»?
Arvind Krmar
capable de le résoudre, tout était correct, mais le pare-feu bloquait l'accès au port 27017 même peut être testé ici: portquiz.net:27017
Arvind Krmar
ok grand codage heureux
kunal usapkar
6

Assurez-vous que les "<" et ">" sont supprimés lorsque vous remplacez les champs utilisateur et mot de passe. Cela a fonctionné pour moi

Smartniggs
la source
3

Parfois, cette erreur se produit en raison de l'adresse IP autorisée à accéder à notre base de données.

Rappelez-vous, votre application peut bien fonctionner, puis trouvez cette erreur. À chaque fois que cela se produit, la plupart du temps, vos adresses IP ont changé, ce qui n'est pas sur la liste blanche des adresses autorisées.

Tout ce que vous avez à faire est d'aller mettre à jour la liste blanche avec vos adresses IP actuelles

Odubola Oluwatimilehin
la source
2

Mettez votre adresse IP de connexion en liste blanche. Atlas autorise uniquement les connexions client au cluster à partir des entrées de la liste blanche du projet. La liste blanche du projet est distincte de la liste blanche de l'API, qui restreint l'accès de l'API à des adresses IP ou CIDR spécifiques.

REMARQUE

Vous pouvez ignorer cette étape si Atlas indique dans l'étape Configuration de la sécurité de la connexion que vous avez déjà configuré une entrée de liste blanche dans votre cluster. Pour gérer la liste blanche IP, voir Ajouter des entrées à la liste blanche.

Si la liste blanche est vide, Atlas vous invite à ajouter une adresse IP à la liste blanche du projet. Vous pouvez soit:

Cliquez sur Ajouter votre adresse IP actuelle pour mettre en liste blanche votre adresse IP actuelle.

Cliquez sur Ajouter une adresse IP différente pour ajouter une seule adresse IP ou une plage d'adresses notée CIDR.

Pour les clusters Atlas déployés sur Amazon Web Services (AWS) et utilisant l'homologation VPC, vous pouvez ajouter un groupe de sécurité associé au VPC homologue.

Vous pouvez fournir une description facultative de l'adresse IP ou de la plage CIDR nouvellement ajoutée. Cliquez sur Ajouter une adresse IP pour ajouter l'adresse à la liste blanche.

Kushal
la source
1

Vous pouvez supprimer l' indicateur {useUnifiedTopology: true} et réinstaller la dépendance des mangoustes! ça a marché pour moi.

Matheus
la source
il donne l'erreur suivante lorsque {useUnifiedTopology: true} est supprimé: (nœud: 10020) DeprecationWarning: le moteur de détection et de surveillance du serveur actuel est obsolète et sera supprimé dans une future version. Pour utiliser le nouveau moteur de découverte et de surveillance du serveur, transmettez l'option {useUnifiedTopology: true} au constructeur MongoClient.
Arvind Krmar
1

J'ai eu la même erreur. Ce sont les étapes que j'ai suivies pour le résoudre

  1. Accédez à l' onglet sécurité -> Accès réseau -> Ensuite, ajoutez votre IP à la liste blanche
  2. Ensuite, allez dans l' onglet sécurité -> Accès à la base de données -> et supprimez votre utilisateur actuel.
  3. Créez un nouvel utilisateur en fournissant un nouveau nom d'utilisateur et un nouveau mot de passe.
  4. Fournir ce nom d' utilisateur et mot de passe nouvellement créé dans le .env fichier ou mongoose.connect méthode

Après ces étapes, cela a fonctionné comme d'habitude. j'espère que cela vous aidera les gars.

Bathiya Seneviratne
la source
0

Tu peux essayer:

// 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:[email protected]: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);
});
Umbro
la source
@ArvindKrmar si vous êtes connecté au site mongo? Vous avez choisi la version node 3.00 or lateret copié `` mongodb + srv: // user: <password> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = true & w = majorité ''? Là, vous avez le choix entre trois options, choisissez le nœud du milieu
Umbro
J'ai sélectionné le nœud "Connecter votre application" et copié la chaîne de connexion ci-dessus, en remplaçant le mot de passe, mais je ne sais pas quel mot de passe il devrait être, le mot de passe par lequel je me suis connecté au dernier MongoDB ou autre chose? J'essaie de savoir
Arvind Krmar
@ArvindKrmar vous avez fourni un mot de passe de base de données distinct
Umbro
J'ai créé deux utilisateurs dans la section "Accès à la base de données" et j'ai conservé le même mot de passe que celui utilisé pour me connecter à mongoDB pour le garder en sécurité ou laisser l'application démarrer, mais pas de chance jusqu'à présent.
Arvind Krmar
1
Le code fonctionne lorsque j'utilise localhost "mongodb: //127.0.0.1/FullStack". La connectivité à l'atlas MongoDB a donc certainement un problème.
Arvind Krmar
0

j'ai eu ce problème, pour moi la solution était de vérifier si mon ip était correctement configuré et avant de confirmer dans cet écran

entrez la description de l'image ici

thiago rodrigues de santana
la source
1
J'ai trouvé la solution. Le problème était dans les paramètres du pare-feu sur mon système réseau. portquiz.net:27017 peut être utilisé pour tester si la connexion est établie. Bien que je n'aie pas changé le pare-feu car il est géré par les administrateurs réseau de mon côté, mais une fois que le pare-feu a corrigé son fonctionnement maintenant. Merci à tous pour vos suggestions.
Arvind Krmar
0

Veuillez vérifier votre mot de passe, votre nom d'utilisateur OU votre configuration IP . La plupart du temps, "La sélection du serveur a expiré après 30000 ms à Timeout._onTimeout" survient chaque fois que les éléments ci-dessus ne correspondent pas à la configuration de votre serveur.

vaibhav
la source
c'était un problème de pare-feu de mon côté. Je l'ai corrigé et maintenant son fonctionnement
Arvind Krmar
0

Je suis en mesure de résoudre le problème. Tout allait bien, mais le pare-feu bloquait l'accès au port 27017. La connectivité peut être testée à http://portquiz.net:27017/ ou en utilisant telnet au point de terminaison qui peut être récupéré à partir de clusters-> Métriques.

Merci à tous pour les suggestions

Arvind Krmar
la source
0

Essayez de créer un nouvel utilisateur dans l'accès à la base de données avec la méthode d'authentification par défaut qui est "SCRAM". Créez ensuite un nouveau cluster pour cela. Ça a marché pour moi! Mon fichier 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:[email protected]/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}`);
});
Adarsh ​​Pawar
la source
0

Quelle est votre version mangouste? car il y a un problème avec une certaine version mangouste. Veuillez visiter ce lien pour plus de détails " https://github.com/Automattic/mongoose/issues/8180 ". Quoi qu'il en soit, je faisais face au même problème, mais après avoir utilisé une ancienne version (5.5.2), cela a fonctionné pour moi. Veuillez essayer et faites-moi savoir ce qui s'est passé.

Walid Ahmed
la source
Je rencontrais le même problème, cependant, je développe fréquemment avec mon VPN activé et désactivé. En rallumant mon VPN, j'ai réussi à me connecter à la base de données. J'espère que ce problème est temporaire, car je ne peux pas toujours avoir mon VPN activé.
Mike K
0

Cela peut être essentiellement dû à une mise à jour npm. Je viens de mettre à jour vers npm v 6.13.7. et j'ai commencé à avoir cette erreur.

En suivant les instructions de @Matheus, j'ai commenté la ligne "{useUnifiedTopology: true}" et j'ai pu passer au travers.

J'ai mis à jour la mangouste et tout fonctionne bien.

Foz
la source
0

Utilisez-vous un antivirus, un pare-feu, un VPN ou sur le réseau restreint (par exemple, une connexion Wi-Fi / LAN professionnelle / commerciale)? Essayez ensuite de le désactiver / de vous reconnecter à un autre réseau. Certaines adresses IP / connexions peuvent être bloquées par l'administrateur d'un réseau que vous utilisez ou simplement un antivirus peut avoir des politiques de pare-feu. Même si vous 0.0.0.0en avez IP Addressà l'Atlas MongoDB.

Daniel Danielecki
la source
0

J'ai eu le même problème. Je pouvais me connecter à partir de MongoDB Compass ou de mon application Node en utilisant les chaînes de connexion que Atlas m'a fournies. Je l'ai résolu en ajoutant mon adresse IP dans la liste blanche d'Atlas.

rekwet
la source
0

À tous ceux qui luttent encore contre ce problème. J'ai résolu ce problème en définissant tous les paramètres comme le nom d'utilisateur, le mot de passe et le nom de base de données dans les options de mangouste.

Auparavant, le code était comme ça. (Quand j'ai eu l'erreur).

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

Notez que l'URL dans mongo connect. mongodb://${dbAddress}:${dbPort}/${dbName}.

Nouveau code sans erreur.

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

Notez les options et l'url.

Ceci est mon env local. Pas de production env.

J'espère que ce sera utile.

Lalit Sharma
la source
0

essayez de spécifier le pilote de noeud, version 2,2,12 dans le cluster -> connect -> connectez votre application. la nouvelle chaîne doit être avec mongodb: //. utilisez cette chaîne pour vous connecter. n'oubliez pas de saisir un mot de passe

dkovskij
la source