Kesalahan koneksi MongoDB: MongoTimeoutError: Pemilihan server habis setelah 30000 ms

11

Saya mencoba membuat aplikasi fullstack dengan membaca tutorial berikut:

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

Saya mengikuti semua langkah dan kemudian mencoba menjalankan:

node server.js

Tapi saya mendapat kesalahan berikut:

Kesalahan koneksi MongoDB: MongoTimeoutError: Pemilihan server habis setelah 30000 ms pada Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) di listOnTimeout (internal / timers.js: 531: 17) di processTimers (internal / timers.js: 475: 7) {nama: 'MongoTimeoutError', alasan: Galat: hubungkan ETIMEDOUT 99.80.11.208:7017 di TCPConnectWrap.afterConnect [seperti oncomplete] (net. js: 1128: 14) {nama: 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (simpul: 42892) Tidak ditanganiMenghapusJumlahPengingat: Server tidak lagi diambil sebelum waktu server00 waktu alih di Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) di listOnTimeout (internal / timers.js: 531: 17) di processTimers (internal / timers.js: 475: 7)

Kode saya di server.js adalah sebagai berikut:

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

Ada saran?

Arvind Krmar
sumber
1
Apakah Anda berubah user:passwordke Anda username and passwordconnection string di?
Shivam Sood
@ShivamSood Ya, saya lakukan
Arvind Krmar
Untuk menambah info, saya mencoba terhubung menggunakan komunitas kompas MongoDB tetapi memberikan kesalahan yang sama. Bisakah itu beberapa pengaturan di atLas Mongodb?
Arvind Krmar
2
aplikasi berjalan dengan baik dengan MongoDB lokal "mongodb: //127.0.0.1/FullStack". Muncul konektivitas ke atlas MongoDB adalah masalahnya.
Arvind Krmar
1
Saya bisa menyelesaikannya. Firewall memblokir akses, hal yang sama dapat diuji dengan ini: portquiz.net:7017
Arvind Krmar

Jawaban:

25

cukup buka panel admin mongodb atlas. Buka tab keamanan> Akses Jaringan> Lalu masukkan daftar putih IP Anda dengan menambahkannya

Lihat gambar ini untuk menemukan menu tertentu

Catatan: Periksa IP Anda di google lalu tambahkan

kunal usapkar
sumber
2
Melakukan itu, tetapi tidak berhasil. Sebaliknya saya mengizinkan semua IP, masih tidak berfungsi
Arvind Krmar
bro,
sudahkah
Saya telah membuat peran untuk akses db: username: arvind Metode otentikasi: SCRAM MongoDBRoles: atlasAdmin @ admin Apakah saya perlu membuat sesuatu di cluster atau 'Danau Data'?
Arvind Krmar
dapat menyelesaikannya, semuanya benar, tetapi firewall memblokir akses ke port 27017 yang sama dapat diuji di sini: portquiz.net:7017
Arvind Krmar
oke hebatnya senang coding
kunal usapkar
6

Pastikan bahwa "<" dan ">" dihapus ketika Anda mengganti bidang pengguna dan kata sandi. Ini berhasil untuk saya

Smartniggs
sumber
3

Terkadang kesalahan ini terjadi karena Alamat IP diberikan akses ke database kami.

Pikiran Anda, aplikasi Anda dapat berfungsi dengan baik kemudian muncul dengan kesalahan seperti itu. Kapan pun ini terjadi, sebagian besar alamat IP Anda telah berubah, yang tidak termasuk dalam daftar putih alamat yang diizinkan.

Yang harus Anda lakukan adalah memperbarui daftar putih dengan alamat IP Anda saat ini

Odubola Oluwatimilehin
sumber
2

Daftar putih alamat IP koneksi Anda. Atlas hanya mengizinkan koneksi klien ke kluster dari entri dalam daftar putih proyek. Daftar putih proyek berbeda dari daftar putih API, yang membatasi akses API ke alamat IP atau CIDR tertentu.

CATATAN

Anda dapat melewati langkah ini jika Atlas menunjukkan dalam langkah Pengaturan Koneksi Keamanan bahwa Anda telah mengkonfigurasi entri daftar putih di cluster Anda. Untuk mengelola daftar putih IP, lihat Tambahkan Entri ke Daftar Putih.

Jika daftar putih kosong, Atlas meminta Anda untuk menambahkan alamat IP ke daftar putih proyek. Anda dapat:

Klik Tambahkan Alamat IP Anda Saat Ini untuk memasukkan daftar putih alamat IP Anda saat ini.

Klik Tambahkan Alamat IP yang Berbeda untuk menambahkan satu alamat IP atau rentang alamat yang diberitahukan CIDR.

Untuk cluster Atlas yang digunakan di Amazon Web Services (AWS) dan menggunakan VPC Peering, Anda dapat menambahkan Grup Keamanan yang terkait dengan VPC rekan.

Anda dapat memberikan deskripsi opsional untuk alamat IP yang baru ditambahkan atau rentang CIDR. Klik Tambahkan Alamat IP untuk menambahkan alamat ke daftar putih.

Kushal
sumber
1

Anda dapat menghapus flag {useUnifiedTopology: true} dan menginstal ulang dependensi luoose! itu berhasil untuk saya.

Matheus
sumber
itu memberikan kesalahan berikut ketika {useUnifiedTopology: true} dihapus: (node: 10020) DeprecationWarning: mesin Server Discovery and Monitoring saat ini sudah tidak digunakan lagi, dan akan dihapus dalam versi yang akan datang. Untuk menggunakan mesin Server Discover and Monitoring, kirimkan opsi {useUnifiedTopology: true} ke konstruktor MongoClient.
Arvind Krmar
1

Saya mendapat kesalahan yang sama. Ini adalah langkah-langkah yang saya ikuti untuk menyelesaikannya

  1. Buka tab keamanan -> Akses Jaringan -> Lalu masukkan daftar putih IP Anda
  2. Lalu buka tab keamanan -> Akses Database -> dan hapus pengguna Anda saat ini.
  3. Buat pengguna baru dengan memberikan nama pengguna dan kata sandi baru.
  4. Berikan nama pengguna dan kata sandi yang baru dibuat dalam file .env atau metode mongoose.connect

Setelah langkah-langkah ini bekerja seperti biasa. Semoga ini bisa membantu kalian.

Bathiya Seneviratne
sumber
0

Anda dapat mencoba:

// 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
sumber
@ArvindKrmar jika Anda masuk ke situs web mongo? Anda memilih versi node 3.00 or laterdan menyalin `mongodb + srv: // user: <password> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = true & w = mayoritas ''? Di sana Anda memiliki tiga opsi untuk dipilih, pilih simpul tengah
Umbro
Saya memilih simpul "Sambungkan aplikasi Anda" dan menyalin string koneksi di atas, mengganti kata sandi, namun saya tidak yakin kata sandi apa yang seharusnya, kata sandi yang saya gunakan untuk login ke MongoDB paling tidak atau yang lainnya? Saya mencoba mencari tahu
Arvind Krmar
@ArvindKrmar Anda memberikan kata sandi basis data yang terpisah
Umbro
Saya membuat dua pengguna di bagian "Akses basis data" dan menyimpan kata sandi yang sama seperti yang saya gunakan untuk masuk di mongoDB agar tetap aman demi atau membiarkan aplikasi mulai berjalan, tetapi tidak beruntung sejauh ini.
Arvind Krmar
1
Kode ini berfungsi ketika saya menggunakan localhost "mongodb: //127.0.0.1/FullStack". Jadi tentu saja konektivitas ke atlas MongoDB memiliki beberapa masalah.
Arvind Krmar
0

Saya memiliki masalah ini, bagi saya solusinya adalah memeriksa apakah ip saya dikonfigurasi dengan benar dan sebelum mengkonfirmasi di layar ini

masukkan deskripsi gambar di sini

thiago rodrigues de santana
sumber
1
Saya menemukan solusinya. Masalahnya adalah pengaturan firewall di sistem jaringan saya. portquiz.net:7017 dapat digunakan untuk menguji apakah koneksi melalui. Meskipun saya tidak mengubah firewall seperti yang dikelola oleh admin jaringan pada akhirnya, tetapi setelah firewall dikoreksi sekarang berfungsi. Terima kasih semuanya atas saran.
Arvind Krmar
0

Silakan periksa kata sandi, nama pengguna atau konfigurasi IP Anda . Sebagian besar "Pemilihan server habis setelah 30000 ms di Timeout._onTimeout" muncul setiap kali hal-hal di atas tidak cocok dengan konfigurasi server Anda.

vaibhav
sumber
itu masalah firewall di akhir saya. Saya memperbaikinya dan sekarang berfungsi
Arvind Krmar
0

Saya bisa menyelesaikan masalah ini. Semuanya baik-baik saja, tetapi firewall memblokir akses ke port 27017. konektivitas dapat diuji di http://portquiz.net:7017/ atau menggunakan telnet ke titik akhir yang dapat diambil dari klaster-> Metrik.

Terima kasih, semuanya atas sarannya

Arvind Krmar
sumber
0

Cobalah untuk membuat Pengguna baru di Akses Database dengan Metode Otentikasi default yaitu "SCRAM". Kemudian buat Cluster baru untuk itu. Itu berhasil untuk saya! File server.js saya

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
sumber
0

Apa versi luwak Anda? karena ada masalah dengan versi luwak tertentu. Silakan kunjungi tautan ini untuk detail lebih lanjut " https://github.com/Automattic/mongoose/issues/8180 ". Bagaimanapun, saya menghadapi masalah yang sama tetapi setelah menggunakan versi yang lebih lama (5.5.2), itu berhasil untuk saya. Tolong beri mencoba dan beri tahu saya apa yang terjadi.

Walid Ahmed
sumber
Saya mengalami masalah yang sama, namun, saya sering berkembang dengan VPN saya mati-matian. Dengan menyalakan VPN saya lagi, saya berhasil terhubung ke DB. Saya berharap masalah ini bersifat sementara, karena saya tidak selalu dapat mengaktifkan VPN.
Mike K
0

Ini pada dasarnya mungkin karena pembaruan npm. Saya baru saja memperbarui ke npm v 6.13.7. dan saya mulai mendapatkan kesalahan itu.

Mengikuti instruksi dari @Matheus, saya berkomentar di baris "{useUnifiedTopology: true}" dan saya bisa melewatinya.

Saya memperbarui luwak dan semuanya berfungsi dengan baik.

Foz
sumber
0

Apakah Anda menggunakan Antivirus, Firewall, VPN atau pada jaringan terbatas (mis. Koneksi Wi-Fi / LAN komersial / komersial)? Kemudian cobalah untuk mematikannya / menghubungkan kembali ke jaringan yang berbeda. Beberapa IP / koneksi mungkin diblokir oleh administrator jaringan yang Anda gunakan atau hanya antivirus mungkin memiliki kebijakan firewall. Meskipun jika Anda miliki 0.0.0.0di IP AddressAtlas MongoDB Anda.

Daniel Danielecki
sumber
0

Saya memiliki masalah yang sama. Saya dapat terhubung dari MongoDB Compass atau aplikasi Node saya menggunakan string koneksi yang diberikan Atlas kepada saya. Saya mengatasinya dengan menambahkan Alamat IP saya ke dalam Daftar Putih di Atlas.

rekwet
sumber
0

Untuk siapa pun yang masih berjuang melalui masalah ini. Saya menyelesaikan masalah ini dengan mengatur semua parameter seperti nama pengguna, kata sandi dan dbName dalam opsi luwak itu sendiri.

Sebelumnya kodenya seperti ini. (Ketika saya mendapatkan kesalahan).

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

Perhatikan bahwa url di mongo terhubung. mongodb://${dbAddress}:${dbPort}/${dbName}.

Kode baru tanpa kesalahan.

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

Perhatikan opsi dan urlnya.

Ini adalah env lokal saya. Bukan produksi env.

Semoga ini akan membantu.

Lalit Sharma
sumber
0

coba tentukan driver simpul, versi 2,2,12 dalam cluster -> connect -> sambungkan aplikasi Anda. string baru harus dengan mongodb: //. gunakan string ini untuk terhubung. jangan lupa untuk memasukkan kata sandi

dkovskij
sumber