MongoDB 연결 오류 : MongoTimeoutError : 30000ms 후에 서버 선택 시간이 초과되었습니다


11

다음 자습서를 읽는 풀 스택 앱을 만들려고합니다.

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 : Timeout._onTimeout (C : \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js : 308 : 9)에서 30000ms 후에 서버 선택 시간이 초과되었습니다 (내부 / processTimers (internal / timers.js : 475 : 7)의 timers.js : 531 : 17) {이름 : 'MongoTimeoutError', 이유 : 오류 : TCPConnectWrap.afterConnect의 [oncomplete] (net. EnetDOUT 99.80.11.208:27017에 연결) js : 1128 : 14) {이름 : 'MongoNetworkError', [Symbol (mongoErrorContextSymbol)] : {}}, [Symbol (mongoErrorContextSymbol)] : {}} (node ​​: 42892) UnhandledPromiseRejectionWarning : MongoTimeoutError : 30000ms 후에 서버 선택 시간이 초과되었습니다 Timeout._onTimeout에서 (C : \ RND \ fullstack_app \ backend \ node_modules \ mongodb \ lib \ core \ sdam \ server_selection.js : 308 :9) processTimers (internal / timers.js : 475 : 7)의 listOnTimeout (internal / timers.js : 531 : 17)

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, 내가 그랬어
아빈 Krmar에게

정보에 추가하기 위해 MongoDB 나침반 커뮤니티를 사용하여 연결하려고했지만 동일한 오류가 발생했습니다. at Las Mongodb에서 일부 설정이 가능합니까?
Arvind Krmar

2
응용 프로그램이 로컬 MongoDB "mongodb : //127.0.0.1/FullStack"에서 제대로 실행되고 있습니다. Atlas MongoDB에 대한 연결성이 문제인 것으로 나타납니다.
Arvind Krmar

1
나는 그것을 해결할 수 있습니다. 방화벽이 액세스를 차단하고 있었 으므로
Arvind Krmar

답변:


25

mongodb atlas 관리자 패널로 이동하십시오. 보안 탭> 네트워크 액세스>로 이동 한 다음 IP를 추가하여 화이트리스트에 추가하십시오

특정 메뉴를 찾으려면이 이미지를 참조하십시오

참고 : 구글에서 IP를 확인하고 추가하십시오


2
그렇게했지만 운이 없다. 오히려 나는 아직도, 모든 IP를 허용 작동하지 않았다
아빈 Krmar

bro, DB 설정을 올바르게
하셨나요?

db 액세스에 대한 역할을 생성했습니다. username : 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는 프로젝트의 화이트리스트에있는 항목에서 클러스터에 대한 클라이언트 연결 만 허용합니다. 프로젝트 화이트리스트는 특정 IP 또는 CIDR 주소에 대한 API 액세스를 제한하는 API 화이트리스트와 다릅니다.

노트

Atlas가 연결 보안 설정 단계에서 클러스터에 이미 화이트리스트 항목을 구성했음을 표시하면이 단계를 건너 뛸 수 있습니다. IP 화이트리스트를 관리하려면 화이트리스트에 항목 추가를 참조하십시오.

화이트리스트가 비어 있으면 Atlas는 프로젝트의 화이트리스트에 IP 주소를 추가하라는 메시지를 표시합니다. 다음 중 하나를 수행 할 수 있습니다.

현재 IP 주소 추가를 클릭하여 현재 IP 주소를 화이트리스트에 추가하십시오.

단일 IP 주소 또는 CIDR 표시 주소 범위를 추가하려면 다른 IP 주소 추가를 클릭하십시오.

AWS (Amazon Web Services)에 배포되고 VPC 피어링을 사용하는 Atlas 클러스터의 경우 피어 VPC와 관련된 보안 그룹을 추가 할 수 있습니다.

새로 추가 된 IP 주소 또는 CIDR 범위에 대한 선택적 설명을 제공 할 수 있습니다. IP 주소 추가를 클릭하여 화이트리스트에 주소를 추가하십시오.


1

당신은 할 수 있습니다 제거 {useUnifiedTopology을 : TRUE} 플래그와 다시 설치 몽구스 실행 종속! 그것은 나를 위해 일했다.


{useUnifiedTopology : true} removed : (node ​​: 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);
});

웹 사이트 mongo에 로그인 한 경우 @ArvindKrmar? 버전을 선택하고 node 3.00 or later`mongodb + srv : // user : <password> @ cluster0-3zrv8.mongodb.net / test? RetryWrites = true & w = 다수 ''? 당신은 선택할 수있는 세 가지 옵션이 있습니다, 중간 노드를 선택
Umbro

"응용 프로그램 연결"노드를 선택하고 위의 연결 문자열을 복사하여 암호를 바꾸었지만 암호가 무엇인지, 확실하지 않은 암호, atlast MongoDB에 로그인 한 암호 등이 확실하지 않습니까? 내가 알아 내려고하고 있어요
아빈 Krmar에게

별도의 데이터베이스 암호를 제공 @ArvindKrmar
엄브로

"데이터베이스 액세스"섹션에서 두 명의 사용자를 만들고 mongoDB에 로그인 할 때 사용한 비밀번호와 동일한 비밀번호를 유지하여 보안을 유지하거나 애플리케이션이 실행되도록했지만 지금까지는 운이 좋지 않습니다.
Arvind Krmar

1
로컬 호스트 "mongodb : //127.0.0.1/FullStack"을 사용할 때 코드가 작동합니다. 따라서 Atlas MongoDB와의 연결에는 문제가 있습니다.
Arvind Krmar

0

나는이 문제를 겪었다. 나에게 해결책은 IP가 올바르게 구성되어 있는지 확인 하고이 화면에서 확인하기 전에 확인했다.

여기에 이미지 설명을 입력하십시오


1
해결책을 찾았습니다. 문제가 네트워크 시스템의 방화벽 설정에있었습니다. portquiz.net:27017 을 사용하여 연결이 통과했는지 테스트 할 수 있습니다. 방화벽은 결국 네트워크 관리자가 관리하는대로 변경하지 않았지만 일단 방화벽이 작동하면 수정했습니다. 제안 해 주셔서 감사합니다.
Arvind Krmar

0

제발 당신의 비밀번호, 사용자 이름이나 IP 구성을 확인합니다 . 대부분 "Timeout._onTimeout에서 30000ms 후에 서버 선택 시간이 초과되었습니다"는 위의 사항이 서버 구성과 일치하지 않을 때마다 나타납니다.


내 방화벽 문제였습니다. 나는 그것을 수정하고 지금은 작동합니다
Arvind Krmar

0

문제를 해결할 수 있습니다. 모든 것이 잘되었지만 방화벽은 포트 27017에 대한 액세스를 차단했습니다. 연결은 http://portquiz.net:27017/ 에서 테스트 하거나 telnet을 사용하여 엔드 포인트에 대한 클러스터-> Metrics에서 검색 할 수 있습니다.

감사합니다


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을 다시 켜서 DB에 연결할 수있었습니다. VPN을 항상 켤 수는 없기 때문에이 문제가 일시적이기를 바랍니다.
마이크 K

0

기본적으로 npm 업데이트 때문일 수 있습니다. 방금 npm v 6.13.7로 업데이트했습니다. 나는 그 오류가 발생하기 시작했다.

@Matheus의 지시에 따라 "{useUnifiedTopology : true}"줄에 주석을 달았습니다.

몽구스를 업데이트하고 모든 것이 잘 작동합니다.


0

바이러스 백신, 방화벽, VPN 또는 제한된 네트워크 (예 : 업무용 / 상업용 Wi-Fi / LAN 연결)를 사용하고 있습니까? 그런 다음 전원을 끄거나 다른 네트워크에 다시 연결하십시오. 사용중인 네트워크 관리자가 일부 IP / 연결을 차단했거나 바이러스 백신에 방화벽 정책이있을 수 있습니다. 심지어 당신이있는 경우에 비록 0.0.0.0당신의 IP AddressMongoDB를지도 책에서.


0

나는 같은 문제가 있었다. Atlas가 제공 한 연결 문자열을 사용하여 MongoDB Compass 또는 Node 앱에서 연결할 수 있습니다. Atlas의 화이트리스트에 내 IP 주소를 추가하여 문제를 해결했습니다.


0

여전히이 문제로 어려움을 겪고있는 사람에게. mongoose 옵션 자체에서 username, password 및 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;
    }
});

mongo connect의 URL은 유의하십시오. 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을 적어 둡니다.

이것은 내 지역 환경입니다. 생산 환경이 아님

희망이 도움이 될 것입니다.


0

클러스터에서 노드 드라이버 버전 2,2,12를 지정하십시오-> 연결-> 응용 프로그램을 연결하십시오. 새 문자열은 mongodb : //와 함께 있어야합니다. 이 문자열을 사용하여 연결하십시오. 비밀번호를 입력하는 것을 잊지 마십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.