Lỗi kết nối MongoDB: MongoTimeoutError: Lựa chọn máy chủ đã hết thời gian sau 30000 ms


11

Tôi đang cố gắng tạo một ứng dụng fullstack đọc hướng dẫn sau:

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

Tôi làm theo tất cả các bước và sau đó cố gắng chạy:

node server.js

Nhưng tôi đã nhận được lỗi sau:

Lỗi kết nối MongoDB: MongoTimeoutError: Lựa chọn máy chủ đã hết thời gian sau 30000 ms tại Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: timers.js: 531: 17) tại processTimers (Internal / timers.js: 475: 7) {name: 'MongoTimeoutError', reason: Error: kết nối ETIMEDOUT 99.80.11.208:27017 tại TCPConnectWrap.afterConnect [như trên máy tính. js: 1128: 14) {name: 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)]: {}}, [Symbol (mongoErrorContextSymbol)]: {}} (nút: 42892) UnhandledPromise tại Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) tại listOnTimeout (nội bộ / timers.js: 531: 17) tại processTimers (Internal / timers.js: 475: 7)

Mã của tôi tại server.js như sau:

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

Bất kỳ đề xuất?


1
Bạn đã thay đổi trong chuỗi kết nối user:passwordcủa bạn username and password?
Shivam Sood

@ShivamSood Vâng, tôi đã làm
Arvind Krmar

Để thêm vào thông tin, tôi đã cố gắng kết nối bằng cộng đồng la bàn MongoDB nhưng nó cũng bị lỗi tương tự. Nó có thể là một số cài đặt tại atLas Mongodb?
Arvind Krmar

2
ứng dụng đang chạy tốt với MongoDB cục bộ "mongodb: //127.0.0.1/FullStack". Xuất hiện kết nối với atlas MongoDB là vấn đề.
Arvind Krmar

1
Tôi có thể giải quyết nó. Tường lửa đã chặn truy cập, điều tương tự có thể được kiểm tra với điều này: portquiz.net:27017
Arvind Krmar

Câu trả lời:


25

chỉ cần truy cập bảng điều khiển quản trị bản đồ mongodb. Đi vào tab bảo mật> Truy cập mạng> Sau đó liệt kê danh sách IP của bạn bằng cách thêm nó

Xem hình ảnh này để xác định vị trí menu cụ thể

Lưu ý: Kiểm tra IP của bạn trên google sau đó thêm nó


2
Đã làm điều đó, nhưng không có may mắn. Thay vào đó, tôi cho phép tất cả các IP, vẫn không hoạt động
Arvind Krmar 16/12/19

bạn
ơi

Tôi đã tạo các vai trò để truy cập db: tên người dùng: arvind Phương thức xác thực: SCRAM MongoDBRoles: atlasAdmin @ admin Tôi có cần tạo một cái gì đó trong cụm hoặc 'Data Lake' không?
Arvind Krmar

Có thể giải quyết nó, mọi thứ đều chính xác, nhưng tường lửa đã chặn truy cập vào cổng 27017 tương tự có thể được kiểm tra tại đây: portquiz.net:27017
Arvind Krmar

được rồi, mã hóa hạnh phúc tuyệt vời
kunal usapkar

6

Đảm bảo rằng "<" và ">" được xóa khi bạn thay thế các trường người dùng và mật khẩu. Điều này làm việc cho tôi


3

Đôi khi lỗi này xảy ra do Địa chỉ IP được cấp quyền truy cập vào cơ sở dữ liệu của chúng tôi.

Xin lưu ý, ứng dụng của bạn có thể hoạt động tốt sau đó xuất hiện lỗi như vậy. Bất cứ khi nào điều này xảy ra, hầu hết các lần địa chỉ IP của bạn đã thay đổi, không nằm trong danh sách trắng của địa chỉ được phép.

Tất cả bạn phải làm là đi cập nhật danh sách trắng với các địa chỉ IP hiện tại của bạn


2

Danh sách trắng địa chỉ IP kết nối của bạn. Atlas chỉ cho phép các kết nối máy khách đến cụm từ các mục trong danh sách trắng của dự án. Danh sách trắng dự án khác với danh sách trắng API, trong đó hạn chế quyền truy cập API vào các địa chỉ IP hoặc CIDR cụ thể.

GHI CHÚ

Bạn có thể bỏ qua bước này nếu Atlas chỉ ra trong bước Thiết lập bảo mật kết nối mà bạn đã định cấu hình mục nhập danh sách trắng trong cụm của mình. Để quản lý danh sách trắng IP, hãy xem Thêm mục nhập vào danh sách trắng.

Nếu danh sách trắng trống, Atlas sẽ nhắc bạn thêm địa chỉ IP vào danh sách trắng của dự án. Bạn có thể:

Nhấp vào Thêm địa chỉ IP hiện tại của bạn để liệt kê danh sách địa chỉ IP hiện tại của bạn.

Nhấp vào Thêm địa chỉ IP khác nhau để thêm một địa chỉ IP hoặc một dải địa chỉ được ký hiệu CIDR.

Đối với các cụm Atlas được triển khai trên Amazon Web Services (AWS) và sử dụng VPC Peering, bạn có thể thêm Nhóm bảo mật được liên kết với VPC ngang hàng.

Bạn có thể cung cấp một mô tả tùy chọn cho địa chỉ IP mới hoặc phạm vi CIDR. Nhấp vào Thêm địa chỉ IP để thêm địa chỉ vào danh sách trắng.


1

Bạn có thể xóa cờ {useUnifiedTopology: true} và cài đặt lại phụ thuộc mongoose! nó làm việc cho tôi


nó đưa ra lỗi sau khi {useUnifiedTopology: true} bị xóa: (nút: 10020) Khấu haoWarning: Công cụ giám sát và khám phá máy chủ hiện tại không được chấp nhận và sẽ bị xóa trong phiên bản tương lai. Để sử dụng công cụ Giám sát và Khám phá Máy chủ mới, hãy chuyển tùy chọn {useUnifiedTopology: true} cho hàm tạo MongoClient.
Arvind Krmar

1

Tôi đã nhận được cùng một lỗi. Đây là những bước tôi làm theo để giải quyết nó

  1. Chuyển đến tab bảo mật -> Truy cập mạng -> Sau đó, danh sách trắng IP của bạn
  2. Sau đó chuyển đến tab bảo mật -> Truy cập cơ sở dữ liệu -> và xóa người dùng hiện tại của bạn.
  3. Tạo người dùng mới bằng cách cung cấp tên người dùng và mật khẩu mới.
  4. Cung cấp tên người dùng và mật khẩu mới được tạo trong tệp .env hoặc phương thức mongoose.connect

Sau những bước này nó hoạt động như bình thường. Hy vọng điều này sẽ giúp các bạn.


0

Bạn co thể thử:

// 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 nếu bạn đang đăng nhập vào trang web mongo? Bạn đã chọn phiên bản node 3.00 or latervà sao chép `` mongodb + srv: // user: <password> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = true & w = đa số ''? Ở đó bạn có ba tùy chọn để chọn, chọn nút giữa
Umbro

Tôi đã chọn nút "Kết nối ứng dụng của bạn" và sao chép chuỗi kết nối ở trên, thay thế mật khẩu, tuy nhiên tôi không chắc nó nên là mật khẩu nào, mật khẩu mà tôi đã đăng nhập vào MongoDB hay cái gì khác? Tôi đang cố gắng tìm hiểu
Arvind Krmar

@ArvindKrmar bạn đã cung cấp mật khẩu cơ sở dữ liệu riêng
Umbro

Tôi đã tạo hai người dùng tại phần "Truy cập cơ sở dữ liệu" và giữ cùng một mật khẩu như tôi đã sử dụng để đăng nhập tại mongoDB để giữ an toàn cho mục đích này hoặc để ứng dụng bắt đầu chạy, nhưng không may mắn cho đến nay.
Arvind Krmar

1
Mã đang hoạt động khi tôi sử dụng localhost "mongodb: //127.0.0.1/FullStack". Vì vậy, chắc chắn kết nối với atlas MongoDB có một số vấn đề.
Arvind Krmar

0

Tôi đã có vấn đề này, với tôi giải pháp là kiểm tra xem ip của tôi có được cấu hình đúng không và trước khi xác nhận trong màn hình này

nhập mô tả hình ảnh ở đây


1
Tôi tìm thấy giải pháp. Vấn đề là trong cài đặt tường lửa tại hệ thống mạng của tôi. portquiz.net:27017 có thể được sử dụng để kiểm tra nếu kết nối được thông qua. Mặc dù tôi đã không thay đổi tường lửa vì điều đó được quản lý bởi các quản trị viên mạng, nhưng một khi tường lửa đã sửa nó hoạt động. Cảm ơn mọi người đã góp ý.
Arvind Krmar

0

Vui lòng kiểm tra mật khẩu, tên người dùng hoặc cấu hình IP . Chủ yếu là "Lựa chọn máy chủ đã hết thời gian sau 30000 ms tại Timeout._onTimeout" xuất hiện bất cứ khi nào những điều trên của bạn không phù hợp với cấu hình máy chủ của bạn.


đó là một vấn đề tường lửa ở cuối của tôi. Tôi đã sửa nó và bây giờ nó hoạt động
Arvind Krmar

0

Tôi có thể giải quyết vấn đề. Mọi thứ đều ổn, nhưng tường lửa đã chặn truy cập vào cổng 27017. kết nối có thể được kiểm tra tại http://portquiz.net:27017/ hoặc sử dụng telnet đến điểm cuối có thể được truy xuất từ ​​cụm-> Số liệu.

Cảm ơn mọi người vì những gợi ý


0

Cố gắng tạo Người dùng mới trong Quyền truy cập cơ sở dữ liệu bằng Phương thức xác thực mặc định là "SCRAM". Sau đó tạo một cụm mới cho điều đó. Nó làm việc cho tôi! Tệp server.js của tôi

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

Phiên bản cầy mangut của bạn là gì? bởi vì có một vấn đề với một phiên bản cầy mangut nhất định. Vui lòng truy cập liên kết này để biết thêm chi tiết " https://github.com/Automattic/mongoose/issues/8180 ". Dù sao, tôi đã phải đối mặt với cùng một vấn đề nhưng sau khi sử dụng phiên bản cũ hơn (5.5.2), nó đã hoạt động với tôi. Hãy thử và cho tôi biết những gì đã xảy ra.


Tôi đã gặp phải vấn đề tương tự, tuy nhiên, tôi thường xuyên phát triển với VPN bật và tắt. Bằng cách bật lại VPN, tôi đã kết nối được với DB. Tôi hy vọng vấn đề này là tạm thời, vì tôi không thể luôn bật VPN.
Mike K

0

Về cơ bản có thể là do cập nhật npm. Tôi vừa cập nhật lên npm v 6.13.7. và tôi bắt đầu nhận được lỗi đó.

Theo hướng dẫn từ @Meditus, tôi đã nhận xét dòng "{useUnifiedTopology: true}" và tôi đã có thể vượt qua nó.

Tôi cập nhật cầy mangut và mọi thứ hoạt động tốt.


0

Bạn có đang sử dụng bất kỳ phần mềm chống vi-rút, tường lửa, VPN hoặc trên mạng bị hạn chế (ví dụ: kết nối Wi-Fi / LAN thương mại) không? Sau đó thử tắt / kết nối lại với một mạng khác. Một số IP / kết nối có thể bị chặn bởi quản trị viên của mạng mà bạn đang sử dụng hoặc đơn giản là phần mềm chống vi-rút có thể có chính sách tường lửa. Mặc dù nếu bạn có 0.0.0.0trong IP AddressMongoDB Atlas.


0

Tôi gặp vấn đề tương tự. Tôi có thể kết nối từ MongoDB Compass hoặc ứng dụng Node của mình bằng chuỗi kết nối mà Atlas đã cho tôi. Tôi đã giải quyết nó bằng cách thêm Địa chỉ IP của tôi vào Danh sách trắng trong Atlas.


0

Để bất cứ ai vẫn còn đấu tranh thông qua vấn đề này. Tôi đã giải quyết vấn đề này bằng cách đặt tất cả các tham số như tên người dùng, mật khẩu và dbName trong các tùy chọn mongoose.

Trước đó mã là như thế này. (Khi tôi nhận được lỗi).

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

Lưu ý rằng url trong mongo kết nối. mongodb://${dbAddress}:${dbPort}/${dbName}.

Mã mới không có lỗi.

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

Lưu ý các tùy chọn và url.

Đây là env địa phương của tôi. Không sản xuất env.

Hy vọng nó sẽ hữu ích.


0

thử chỉ định trình điều khiển nút, phiên bản 2,2,12 trong cụm -> kết nối -> kết nối ứng dụng của bạn. chuỗi mới phải có với mongodb: //. sử dụng chuỗi này để kết nối. đừng quên nhập mật khẩu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.