ข้อผิดพลาดการเชื่อมต่อ MongoDB: MongoTimeoutError: การเลือกเซิร์ฟเวอร์หมดเวลาหลังจาก 30000 มิลลิวินาที


11

ฉันกำลังพยายามสร้างแอป fullstack ที่อ่านบทช่วยสอนต่อไปนี้:

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

ฉันทำตามทุกขั้นตอนแล้วลองเรียกใช้:

node server.js

แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

ข้อผิดพลาดการเชื่อมต่อ MongoDB: MongoTimeoutError: การเลือกเซิร์ฟเวอร์หมดเวลาหลังจาก 30000 มิลลิวินาทีที่ Timeout._onTimeout (C: \ RND \ fullstack_app \ แบ็กเอนด์ \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308: 9) ที่ listOnTimeout timers.js: 531: 17) ที่ processTimers (ภายใน / timers.js: 475: 7) {ชื่อ: 'MongoTimeoutError', เหตุผล: ข้อผิดพลาด: เชื่อมต่อ ETIMEDOUT 99.80.11.208:27017 ที่ TCPConnectWrap.afterConnect [ตามที่สมบูรณ์] (สุทธิ js: 1128: 14) {ชื่อ: 'MongoNetworkError', [สัญลักษณ์ (mongoErrorContextSymbol)]: {}}, [สัญลักษณ์ (mongoErrorContextSymbol)]: {}} (โหนด: 42892) การจัดการคำเตือน ที่ Timeout._onTimeout (C: \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js: 308:9) ที่ listOnTimeout (ภายใน / timers.js: 531: 17) ที่ processTimers (internal / timers.js: 475: 7)

รหัสของฉันที่ server.js มีดังนี้:

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

ข้อเสนอแนะใด ๆ


1
คุณเปลี่ยนuser:passwordเป็นusername and passwordสายเชื่อมต่อของคุณหรือไม่
Shivam Sood

@ShivamSood ใช่ฉันทำแล้ว
Arvind Krmar

เพื่อเพิ่มข้อมูลฉันพยายามเชื่อมต่อโดยใช้ชุมชนเข็มทิศ MongoDB แต่มันก็มีข้อผิดพลาดเดียวกัน สามารถตั้งค่าบางอย่างได้ที่ at Mongasb หรือไม่
Arvind Krmar

2
แอปพลิเคชันทำงานได้ดีกับ MongoDB ในท้องถิ่น "mongodb: //127.0.0.1/FullStack" ปรากฏการเชื่อมต่อกับ atlas MongoDB เป็นปัญหา
Arvind Krmar

1
ฉันสามารถแก้ไขได้ ไฟร์วอลล์กำลังบล็อกการเข้าถึงเหมือนกันสามารถทดสอบกับสิ่งนี้: portquiz.net:27017
Arvind Krmar

คำตอบ:


25

เพียงไปที่แผงควบคุมของ mongodb atlas ไปที่แท็บความปลอดภัย> การเข้าถึงเครือข่าย> จากนั้นเพิ่ม IP ของคุณในรายการที่ปลอดภัย

ดูภาพนี้เพื่อค้นหาเมนูเฉพาะ

หมายเหตุ: ตรวจสอบ IP ของคุณบน google จากนั้นเพิ่ม


2
ทำอย่างนั้น แต่ไม่มีโชค ค่อนข้างฉันอนุญาต IP ทั้งหมด แต่ก็ไม่ทำงาน
Arvind Krmar

คุณได้ตั้งค่าการกำหนดค่า DB อย่างเหมาะสมแล้วหรือยัง
kunal usapkar

ฉันได้สร้างบทบาทสำหรับการเข้าถึง db: ชื่อผู้ใช้: arvind วิธีการรับรองความถูกต้อง: SCRAM MongoDBRoles: atlasAdmin @ admin ฉันต้องสร้างบางอย่างในคลัสเตอร์หรือ 'Data Lake' หรือไม่?
Arvind Krmar

สามารถแก้ไขได้ทุกอย่างถูกต้อง แต่ไฟร์วอลล์กำลังบล็อกการเข้าถึงพอร์ต 27017 เดียวกันสามารถทดสอบได้ที่นี่: portquiz.net:27017
Arvind Krmar

โอเคการเขียนโปรแกรมที่มีความสุขดีมาก
kunal usapkar

6

ตรวจสอบให้แน่ใจว่า "<" และ ">" ถูกลบเมื่อคุณแทนที่ฟิลด์ผู้ใช้และรหัสผ่าน สิ่งนี้ใช้ได้สำหรับฉัน


3

บางครั้งข้อผิดพลาดนี้เกิดขึ้นเนื่องจากที่อยู่ IP ให้การเข้าถึงฐานข้อมูลของเรา

โปรดทราบว่าการสมัครของคุณสามารถทำงานได้ดีจากนั้นเกิดข้อผิดพลาดขึ้น เมื่อใดก็ตามที่สิ่งนี้เกิดขึ้นส่วนใหญ่ที่อยู่ IP ของคุณจะเปลี่ยนไปซึ่งไม่ได้อยู่ในรายการที่อนุญาตของที่อยู่

สิ่งที่คุณต้องทำคือไปอัปเดตบัญชีขาวด้วยที่อยู่ IP ปัจจุบันของคุณ


2

รายการที่อยู่ IP การเชื่อมต่อของคุณที่ปลอดภัย Atlas อนุญาตให้ลูกค้าเชื่อมต่อกับคลัสเตอร์จากรายการในรายการที่อนุญาตของโครงการ รายการที่อนุญาตของโครงการแตกต่างจากรายการที่อนุญาตของ API ซึ่ง จำกัด การเข้าถึง API สำหรับที่อยู่ IP หรือที่อยู่ CIDR ที่เฉพาะเจาะจง

บันทึก

คุณสามารถข้ามขั้นตอนนี้หาก Atlas ระบุในขั้นตอนการตั้งค่าการเชื่อมต่อความปลอดภัยที่คุณได้กำหนดค่ารายการที่อนุญาตในคลัสเตอร์ของคุณ หากต้องการจัดการรายการที่อนุญาต IP ให้ดูเพิ่มรายการลงในรายการที่อนุญาต

หากรายการที่อนุญาตว่างเปล่า Atlas จะแจ้งให้คุณเพิ่มที่อยู่ IP ในรายการที่อนุญาตของโครงการ คุณสามารถ:

คลิกเพิ่มที่อยู่ IP ปัจจุบันของคุณเพื่อทำรายชื่อที่อยู่ IP ปัจจุบันของคุณให้ปลอดภัย

คลิกเพิ่มที่อยู่ IP อื่นเพื่อเพิ่มที่อยู่ IP เดียวหรือช่วงที่อยู่ที่ระบุโดย CIDR

สำหรับกลุ่ม Atlas ที่ปรับใช้บน Amazon Web Services (AWS) และใช้ VPC Peering คุณสามารถเพิ่มกลุ่มความปลอดภัยที่เกี่ยวข้องกับเพียร์ VPC

คุณสามารถให้คำอธิบายเพิ่มเติมสำหรับที่อยู่ IP ที่เพิ่มใหม่หรือช่วง CIDR คลิกเพิ่มที่อยู่ IP เพื่อเพิ่มที่อยู่ลงในรายการที่อนุญาต


1

คุณสามารถลบ {useUnifiedTopology: true}ตั้งค่าสถานะและติดตั้ง mongoose dependecy อีกครั้ง! มันใช้งานได้สำหรับฉัน


มันให้ข้อผิดพลาดต่อไปนี้เมื่อ {useUnifiedTopology: true} ถูกลบออก: (โหนด: 10020) DeprecationWarning: เซิร์ฟเวอร์การค้นหาและเครื่องมือตรวจสอบปัจจุบันเลิกใช้แล้วและจะถูกลบในเวอร์ชันอนาคต เมื่อต้องการใช้เอ็นจิน Server Discover and Monitoring ตัวใหม่ให้ส่งรหัสผ่านตัวเลือก {useUnifiedTopology: true} ไปยังตัวสร้าง MongoClient
Arvind Krmar

1

ฉันได้รับข้อผิดพลาดเดียวกัน นี่คือขั้นตอนที่ฉันทำตามเพื่อแก้ไข

  1. ไปที่แท็บความปลอดภัย -> การเข้าถึงเครือข่าย ->จากนั้นให้รายการ IP ของคุณอนุญาต
  2. จากนั้นไปที่แท็บความปลอดภัย -> การเข้าถึงฐานข้อมูล ->และลบผู้ใช้ปัจจุบันของคุณ
  3. สร้างผู้ใช้ใหม่โดยระบุชื่อผู้ใช้และรหัสผ่านใหม่
  4. ระบุชื่อผู้ใช้และรหัสผ่านที่สร้างขึ้นใหม่ในไฟล์. envหรือวิธีmongoose.connect

หลังจากขั้นตอนเหล่านี้มันทำงานได้ตามปกติ หวังว่านี่จะช่วยพวกคุณได้


0

คุณสามารถลอง:

// 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 หากคุณลงชื่อเข้าใช้เว็บไซต์ mongo? คุณเลือกเวอร์ชันnode 3.00 or laterและคัดลอก `` mongodb + srv: // ผู้ใช้: <password> @ cluster0-3zrv8.mongodb.net / ทดสอบ? RetryWrites = จริง & w = เสียงส่วนใหญ่ '' มีคุณมีสามตัวเลือกให้เลือกเลือกโหนดกลาง
Umbro

ฉันเลือกโหนด "เชื่อมต่อแอปพลิเคชันของคุณ" และคัดลอกสตริงการเชื่อมต่อด้านบนเปลี่ยนรหัสผ่านอย่างไรก็ตามฉันไม่แน่ใจว่าควรใช้รหัสผ่านใดรหัสผ่านที่ฉันเข้าสู่ atlast MongoDB หรืออย่างอื่น ฉันพยายามค้นหา
Arvind Krmar

@ArvindKrmar คุณได้ให้รหัสผ่านฐานข้อมูลแยกต่างหาก
Umbro

ฉันสร้างผู้ใช้สองคนที่ส่วน "การเข้าถึงฐานข้อมูล" และเก็บรหัสผ่านเดียวกับที่ฉันใช้ในการเข้าสู่ระบบที่ mongoDB เพื่อความปลอดภัยหรือเพื่อให้แอปพลิเคชันเริ่มทำงาน แต่ไม่โชคดี
Arvind Krmar

1
รหัสทำงานเมื่อฉันใช้ localhost "mongodb: //127.0.0.1/FullStack" ดังนั้นการเชื่อมต่อกับ atlas MongoDB จึงมีปัญหาบางอย่าง
Arvind Krmar

0

ฉันมีปัญหานี้สำหรับฉันทางออกคือตรวจสอบว่า IP ของฉันถูกกำหนดค่าอย่างถูกต้องและก่อนที่จะยืนยันในหน้าจอนี้

ป้อนคำอธิบายรูปภาพที่นี่


1
ฉันพบวิธีแก้ปัญหา ปัญหานี้เกิดจากการตั้งค่าไฟร์วอลล์ที่ระบบเครือข่ายของฉัน portquiz.net:27017สามารถใช้เพื่อทดสอบว่าการเชื่อมต่อผ่านหรือไม่ แม้ว่าฉันจะไม่ได้เปลี่ยนไฟร์วอลล์ตามที่จัดการโดยผู้ดูแลระบบเครือข่ายในตอนท้าย แต่เมื่อไฟร์วอลล์แก้ไขได้แล้ว ขอบคุณทุกคนสำหรับคำแนะนำ
Arvind Krmar

0

โปรดตรวจสอบรหัสผ่านชื่อผู้ใช้หรือการกำหนดค่า IP ของคุณ ส่วนใหญ่ "การเลือกเซิร์ฟเวอร์หมดเวลาหลังจาก 30000 มิลลิวินาทีที่ Timeout._onTimeout" มาเมื่อใดก็ตามที่สิ่งที่คุณกล่าวมาข้างต้นไม่ตรงกับการกำหนดค่าเซิร์ฟเวอร์ของคุณ


มันเป็นปัญหาไฟร์วอลล์ในตอนท้ายของฉัน ฉันแก้ไขแล้วและตอนนี้มันใช้งานได้
Arvind Krmar

0

ฉันสามารถแก้ไขปัญหาได้ ทุกอย่างถูกปรับ แต่ไฟร์วอลล์ถูกปิดกั้นการเข้าถึงพอร์ตการเชื่อมต่อ 27017. สามารถทดสอบได้ที่http://portquiz.net:27017/หรือใช้ Telnet ไปยังปลายทางที่สามารถเรียกข้อมูลจาก clusters-> ตัวชี้วัด

ขอบคุณทุกคนสำหรับคำแนะนำ


0

ลองสร้างผู้ใช้ใหม่ในการเข้าถึงฐานข้อมูลด้วยวิธีการรับรองความถูกต้องเริ่มต้นซึ่งเป็น "SCRAM" จากนั้นสร้างคลัสเตอร์ใหม่สำหรับสิ่งนั้น มันใช้งานได้สำหรับฉัน! ไฟล์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: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

รุ่นพังพอนของคุณคืออะไร? เนื่องจากมีปัญหากับรุ่นพังพอนบางอย่าง กรุณาเยี่ยมชมลิงค์นี้สำหรับรายละเอียดเพิ่มเติม " https://github.com/Automattic/mongoose/issues/8180 " อย่างไรก็ตามฉันกำลังเผชิญปัญหาเดียวกัน แต่หลังจากใช้รุ่นเก่ากว่า (5.5.2) มันใช้งานได้สำหรับฉัน โปรดลองและแจ้งให้เราทราบว่าเกิดอะไรขึ้น


ฉันพบปัญหาเดียวกัน แต่ฉันมักจะพัฒนาด้วยการเปิดและปิด VPN ของฉัน เมื่อเปิด VPN อีกครั้งฉันก็สามารถเชื่อมต่อกับฐานข้อมูลได้ ฉันหวังว่าปัญหานี้จะเกิดขึ้นชั่วคราวเพราะฉันไม่สามารถเปิด VPN ได้ตลอดเวลา
Mike K

0

อาจเป็นเพราะการอัปเดต npm ฉันเพิ่งอัปเดตเป็น npm v 6.13.7 และฉันเริ่มได้รับข้อผิดพลาดนั้น

ทำตามคำแนะนำจาก @Matheus ฉันให้ความคิดเห็นบรรทัด "{useUnifiedTopology: true}" และฉันสามารถผ่านมันได้

ฉันอัปเดตพังพอนและทุกอย่างทำงานได้ดี


0

คุณใช้ Antivirus, ไฟร์วอลล์, VPN หรือเครือข่ายที่ จำกัด (เช่นการทำงาน / การเชื่อมต่อ Wi-Fi / LAN) จากนั้นลองปิด / เชื่อมต่อใหม่กับเครือข่ายอื่น IP / การเชื่อมต่อบางอย่างอาจถูกบล็อกโดยผู้ดูแลระบบของเครือข่ายที่คุณใช้หรือเพียงแค่ป้องกันไวรัสอาจมีนโยบายไฟร์วอลล์ แม้ว่าคุณจะ0.0.0.0อยู่IP Addressที่ MongoDB Atlas ของคุณก็ตาม


0

ฉันมีปัญหาเดียวกัน ฉันสามารถเชื่อมต่อจาก MongoDB Compass หรือแอป Node ของฉันโดยใช้สตริงการเชื่อมต่อ Atlas ให้ฉัน ฉันแก้ไขได้โดยเพิ่มที่อยู่ IP ของฉันในรายการที่อนุญาตใน Atlas


0

สำหรับทุกคนที่ยังคงดิ้นรนผ่านปัญหานี้ ฉันแก้ไขปัญหานี้โดยการตั้งค่าพารามิเตอร์ทั้งหมดเช่นชื่อผู้ใช้รหัสผ่านและ dbName ในตัวเลือกพังพอนเอง

ก่อนหน้านี้รหัสเป็นเช่นนี้ (เมื่อฉันได้รับข้อผิดพลาด)

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

โปรดทราบว่า URL ในการเชื่อมต่อ Mongo mongodb://${dbAddress}:${dbPort}/${dbName}.

รหัสใหม่โดยไม่มีข้อผิดพลาด

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

จดบันทึกตัวเลือกและ URL

นี่คือ env ท้องถิ่นของฉัน ไม่ใช่การผลิต env

หวังว่ามันจะเป็นประโยชน์


0

ลองระบุไดรเวอร์โหนดรุ่น 2,2,12 ในคลัสเตอร์ -> เชื่อมต่อ -> เชื่อมต่อแอปพลิเคชันของคุณ สตริงใหม่จะต้องมี mongodb: // ใช้สตริงนี้เพื่อเชื่อมต่อ อย่าลืมใส่รหัสผ่าน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.