Erro de conexão do MongoDB: MongoTimeoutError: a seleção do servidor expirou após 30000 ms

11

Estou tentando criar um aplicativo de pilha completa lendo o seguinte tutorial:

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

Eu segui todas as etapas e tentei executar:

node server.js

Mas eu recebi o seguinte erro:

Erro de conexão do MongoDB: MongoTimeoutError: a seleção do servidor expirou após 30000 ms em Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) em listOnTimeout (internal / timers.js: 531: 17) em processTimers (internal / timers.js: 475: 7) {nome: 'MongoTimeoutError', motivo: Erro: conecte ETIMEDOUT 99.80.11.208:27017 em TCPConnectWrap.afterConnect [como oncomplete] (net. js: 1128: 14) {nome: 'MongoNetworkError', [Símbolo (mongoErrorContextSymbol)]: {}}, [Símbolo (mongoErrorContextSymbol)]: {}} (nó: 42892) UnhandledPromiseRejectionWarning: MongoTimeoutError: seleção da hora do servidor em Timeout._onTimeout (C: \ RND \ fullstack_app \ back-end \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) em listOnTimeout (internal / timers.js: 531: 17) em processTimers (internal / timers.js: 475: 7)

Meu código no server.js é o seguinte:

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

Alguma sugestão?

Arvind Krmar
fonte
11
Você mudou user:passwordpara sua username and passwordstring de conexão?
Shivam Sood
@ShivamSood Sim, eu fiz
Arvind Krmar 04/12/19
Para adicionar informações, tentei conectar-me usando a comunidade de bússolas do MongoDB, mas ocorreu o mesmo erro. Pode haver algumas configurações no atLas Mongodb?
Arvind Krmar
2
O aplicativo está funcionando bem com o MongoDB local "mongodb: //127.0.0.1/FullStack". Parece que a conectividade com o atlas MongoDB é o problema.
Arvind Krmar
11
Eu sou capaz de resolver isso. O firewall estava bloqueando o acesso, o mesmo pode ser testado com isso: portquiz.net:27017 #
Arvind Krmar

Respostas:

25

basta ir ao painel de administração do mongodb atlas. Vá na guia Segurança> Acesso à rede> Em seguida, adicione seu IP à lista branca adicionando

Veja esta imagem para localizar o menu específico

Nota: verifique seu IP no google e adicione-o

kunal usapkar
fonte
2
Fiz isso, mas sem sorte. Em vez I permitiu que todos os IPs, ainda não funcionou
Arvind Krmar
bro, você definir a configuração DB corretamente
usapkar kunal
Criei funções para acesso ao banco de dados: nome de usuário: arvind Método de autenticação: SCRAM MongoDBRoles: atlasAdmin @ admin Preciso criar algo no cluster ou no 'Data Lake'?
Arvind Krmar
capaz de resolvê-lo, tudo estava correto, mas o firewall estava bloqueando o acesso à porta 27017 mesmo pode ser testado aqui: portquiz.net:27017
Arvind Krmar
ok ótimo código feliz
kunal usapkar
6

Verifique se os "<" e ">" foram removidos ao substituir os campos de usuário e senha. Isso funcionou para mim

Smartniggs
fonte
3

Às vezes, esse erro ocorre devido ao endereço IP concedido ao nosso banco de dados.

Lembre-se, seu aplicativo pode estar funcionando bem e, em seguida, apresentar esse erro. Sempre que isso acontece, na maioria das vezes seus endereços IP são alterados, o que não está na lista de permissões permitida.

Tudo o que você precisa fazer é atualizar a lista de permissões com seus endereços IP atuais

Odubola Oluwatimilehin
fonte
2

Lista branca seu endereço IP de conexão. O Atlas permite apenas conexões de clientes com o cluster a partir de entradas na lista de permissões do projeto. A lista de permissões do projeto é diferente da lista de permissões da API, que restringe o acesso da API a endereços IP ou CIDR específicos.

NOTA

Você pode pular esta etapa se o Atlas indicar na etapa Setup Connection Security que você já configurou uma entrada da lista de permissões no seu cluster. Para gerenciar a lista de permissões de IP, consulte Adicionar entradas à lista de permissões.

Se a lista de permissões estiver vazia, o Atlas solicitará que você adicione um endereço IP à lista de permissões do projeto. Você também pode:

Clique em Adicionar seu endereço IP atual para colocar na lista branca seu endereço IP atual.

Clique em Adicionar um endereço IP diferente para adicionar um único endereço IP ou um intervalo de endereços anotado pelo CIDR.

Para clusters Atlas implantados no Amazon Web Services (AWS) e usando o VPC Peering, você pode adicionar um Grupo de Segurança associado ao VPC do mesmo nível.

Você pode fornecer uma descrição opcional para o endereço IP ou o intervalo CIDR recém-adicionados. Clique em Adicionar endereço IP para adicionar o endereço à lista de permissões.

Kushal
fonte
1

Você pode remover o sinalizador {useUnifiedTopology: true} e reinstalar a dependência do mangusto! funcionou para mim.

Matheus
fonte
ele fornece o seguinte erro quando {useUnifiedTopology: true} removido: (nó: 10020) DeprecationWarning: o mecanismo atual de Descoberta e Monitoramento de Servidor está obsoleto e será removido em uma versão futura. Para usar o novo mecanismo de detecção e monitoramento de servidor, passe a opção {useUnifiedTopology: true} para o construtor MongoClient.
Arvind Krmar
1

Eu recebi o mesmo erro. Estas são as etapas que segui para resolvê-lo

  1. Vá para a guia Segurança -> Acesso à rede -> Em seguida, adicione seu IP à lista de permissões
  2. Em seguida, vá para a guia segurança -> Acesso ao banco de dados -> e exclua seu usuário atual.
  3. Crie um novo usuário, fornecendo novo nome de usuário e senha.
  4. Forneça que nome de usuário e senha recém-criados no arquivo .env ou no método mongoose.connect

Após essas etapas, funcionou como de costume. Espero que isso ajude vocês.

Bathiya Seneviratne
fonte
0

Podes tentar:

// 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
fonte
@ArvindKrmar se você está logado no site mongo? Você escolheu a versão node 3.00 or latere copiou `` mongodb + srv: // usuário: <senha> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = true & w = maioria ''? Lá você tem três opções para escolher, escolha o nó do meio
Umbro
Selecionei o nó "Conecte seu aplicativo" e copiei a seqüência de conexão acima, substituindo a senha, mas não sei qual deve ser a senha, a senha com a qual entrei no atlo MongoDB ou algo mais? Estou tentando descobrir
Arvind Krmar
@ArvindKrmar você forneceu uma senha de banco de dados separada
Umbro
Criei dois usuários na seção "Acesso ao banco de dados" e mantive a mesma senha que eu costumava fazer login no mongoDB para mantê-la segura e deixar o aplicativo começar a ser executado, mas não por sorte até agora.
Arvind Krmar
11
O código está funcionando quando eu uso o host local "mongodb: //127.0.0.1/FullStack". Portanto, certamente a conectividade com o atlas MongoDB tem algum problema.
Arvind Krmar #
0

eu estava com esse problema, para mim a solução foi verificar se meu ip está configurado corretamente e antes de confirmar nesta tela

insira a descrição da imagem aqui

thiago rodrigues de santana
fonte
11
Eu encontrei a solução. O problema estava nas configurações de firewall no meu sistema de rede. portquiz.net:27017 pode ser usado para testar se a conexão está concluída . Embora eu não mudei o firewall, pois isso é gerenciado pelos administradores de rede no meu final, mas uma vez que o firewall corrigiu seu funcionamento agora. Obrigado a todos por sugestões.
Arvind Krmar
0

Por favor, Verifique a sua senha, configuração de usuário ou IP . Principalmente "A seleção do servidor atingiu o tempo limite após 30000 ms em Timeout._onTimeout" ocorre sempre que os itens acima não coincidem com a configuração do servidor.

vaibhav
fonte
foi um problema de firewall no meu final. Eu o corrigi e agora está funcionando
Arvind Krmar 18/12/19
0

Eu sou capaz de resolver o problema. Tudo estava bem, mas o firewall estava bloqueando o acesso à porta 27017. A conectividade pode ser testada em http://portquiz.net:27017/ ou usando telnet para o terminal que pode ser recuperado em clusters-> Métricas.

Obrigado a todos pelas sugestões

Arvind Krmar
fonte
0

Tente criar um novo usuário no acesso ao banco de dados com o método de autenticação padrão, que é "SCRAM". Em seguida, faça um novo cluster para isso. Funcionou para mim! Meu arquivo 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
fonte
0

Qual é a sua versão do mangusto? porque há um problema com uma certa versão do mangusto. Por favor, visite este link para obter mais detalhes " https://github.com/Automattic/mongoose/issues/8180 ". Enfim, eu estava enfrentando o mesmo problema, mas depois de usar uma versão mais antiga (5.5.2), funcionou para mim. Por favor, tente e deixe-me saber o que aconteceu.

Walid Ahmed
fonte
Eu estava enfrentando o mesmo problema, no entanto, frequentemente desenvolvo com minha VPN ativada e desativada. Ao ativar minha VPN novamente, consegui me conectar ao banco de dados. Espero que esse problema seja temporário, porque nem sempre posso ter minha VPN ativada.
Mike K
0

Pode ser basicamente por causa de uma atualização npm. Acabei de atualizar para a npm v 6.13.7. e comecei a receber esse erro.

Seguindo as instruções do @Matheus, comentei a linha "{useUnifiedTopology: true}" e consegui passar por isso.

Atualizei o mangusto e tudo funciona bem.

Foz
fonte
0

Você está usando algum antivírus, firewall, VPN ou em uma rede restrita (por exemplo, conexão comercial / Wi-Fi / LAN)? Em seguida, tente desligá-lo / reconectar-se a uma rede diferente. Alguns IPs / conexões podem ser bloqueados pelo administrador de uma rede que você está usando ou simplesmente antivírus podem ter políticas de firewall. Mesmo que você tenha 0.0.0.0no IP AddressAtlas do MongoDB.

Daniel Danielecki
fonte
0

Eu tive o mesmo problema. Eu poderia conectar-me a partir do MongoDB Compass ou do meu aplicativo Node usando as cadeias de conexão que a Atlas me deu. Eu o resolvi adicionando meu endereço IP à lista de permissões no Atlas.

rekwet
fonte
0

Para quem ainda está lutando com esse problema. Resolvi esse problema definindo todos os parâmetros como nome de usuário, senha e dbName nas próprias opções de mangusto.

Anteriormente, o código era assim. (Quando eu estava recebendo o erro).

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

Observe que o URL no mongo connect. mongodb://${dbAddress}:${dbPort}/${dbName}.

Novo código sem erro.

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

Observe as opções e o URL.

Este é o meu ambiente local. Não produção env.

Espero que seja útil.

Lalit Sharma
fonte
0

tente especificar o driver do nó, versão 2,2,12 no cluster -> conectar -> conectar seu aplicativo. nova string deve estar com mongodb: //. use essa string para conectar-se. não esqueça de digitar uma senha

dkovskij
fonte