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

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

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

어떤 제안?



답변

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

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

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


답변

사용자 및 비밀번호 필드를 교체 할 때 “<“및 “>”가 제거되었는지 확인하십시오. 이것은 나를 위해 일했다


답변

때때로이 오류는 데이터베이스에 대한 액세스 권한이 부여 된 IP 주소로 인해 발생합니다.

응용 프로그램이 제대로 작동하면 이러한 오류가 발생할 수 있습니다. 이러한 상황이 발생할 때마다 대부분의 IP 주소가 변경되어 허용 된 주소의 허용 목록에 없습니다.

현재 IP 주소로 화이트리스트를 업데이트하기 만하면됩니다.


답변

연결 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 주소 추가를 클릭하여 화이트리스트에 주소를 추가하십시오.


답변

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


답변

같은 오류가 발생했습니다. 다음은 해결하기 위해 수행 한 단계입니다.

  1. 로 이동하여 보안 탭 -> 네트워크 연결 -> 그런 다음 화이트리스트 당신의 IP
  2. 그런 다음 보안 탭-> 데이터베이스 액세스->로 이동 하여 현재 사용자를 삭제하십시오.
  3. 새로운 사용자 이름과 비밀번호를 제공하여 새로운 사용자를 만드십시오.
  4. .env 파일 또는 mongoose.connect 메소드 에서 새로 작성된 사용자 이름 및 비밀번호를 제공하십시오.

이 단계 후에 평소처럼 작동했습니다. 이것이 여러분에게 도움이되기를 바랍니다.


답변

당신은 시도 할 수 있습니다:

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