web-dev-qa-db-fra.com

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

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 à Timeout._onTimeout (C:\RND\fullstack_app\backend\node_modules\mongodb\lib\core\sdam\server_selection.js: 308: 9) à listOnTimeout (internal/timers.js: 531: 17) à 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?

11
Arvind Krmar

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

  1. Allez dans onglet sécurité -> Accès réseau -> Puis ajoutez votre IP à la liste blanche
  2. Ensuite, allez dans 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. Indiquez le nom d'utilisateur et le mot de passe nouvellement créés dans le fichier . Env ou mongoose.connect

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

1
Bathiya Seneviratne

Veuillez Vérifiez votre mot de passe, nom d'utilisateur OR 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 à votre configuration du serveur.

0
vaibhav

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 server.js fichier

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}`);
});
0
Adarsh Pawar

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.

0
Foz

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 des clusters-> Métrique.

Merci à tous pour les suggestions

0
Arvind Krmar

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 avez 0.0.0.0 dans votre IP Address à l'Atlas MongoDB.

0
Daniel Danielecki

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

essayez de spécifier le pilote de nœud, 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

0
dkovskij

Vous pouvez supprimer {useUnifiedTopology: true} marquer et réinstaller la dépendance mangouste! ça a marché pour moi.

0
Matheus

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

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/818 ". 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é.

0
Walid Ahmed

J'ai eu le même problème. Je pouvais me connecter depuis MongoDB Compass ou 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.

0
rekwet

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

0
Lalit Sharma