Mongoose autoReconnect 옵션
저는 Mongoose를 통해 MongoDB 자동 재연결 기능을 설정하려고 합니다.내가 옵션을 통과하려고 시도한 모든 방법은 영향을 미치지 않았고, 적어도.reconnected
이벤트가 방출되지 않습니다.
제가 시도한 것:
mongoose.createConnection("mongodb://localhost:27017/test", { auto_reconnect: true });
mongoose.createConnection("mongodb://localhost:27017/test", { autoReconnect: true });
mongoose.createConnection("mongodb://localhost:27017/test", { server: { auto_reconnect: true } });
mongoose.createConnection("mongodb://localhost:27017/test", { server: { autoReconnect: true } });
중 , 만약이중맞다면하가나것들,reconnected
이벤트가 트리거되고 메시지가 콘솔에 기록되어야 하지만 이는 절대 발생하지 않습니다.
다시 연결하기 전에 지연이 발생하면 구성 방법을 아는 사람이 있습니까?
잘 부탁드립니다.
이것을 조사하는 사람은 몽구스 저장소에서 이 문제와 이 문제를 살펴보십시오.
저도 당신과 같은 질문이 있었고, 로버트 클렙의 해결책은 저에게도 통하지 않았습니다.MongoDB 서비스가 중지되면 오류 이벤트가 트리거되지만 connection.readyState는 여전히 1(연결됨)입니다.그래서 자동으로 다시 연결되지 않았을 수도 있습니다.
이것이 제가 지금 가지고 있는 것입니다.
var db = mongoose.connection;
db.on('connecting', function() {
console.log('connecting to MongoDB...');
});
db.on('error', function(error) {
console.error('Error in MongoDb connection: ' + error);
mongoose.disconnect();
});
db.on('connected', function() {
console.log('MongoDB connected!');
});
db.once('open', function() {
console.log('MongoDB connection opened!');
});
db.on('reconnected', function () {
console.log('MongoDB reconnected!');
});
db.on('disconnected', function() {
console.log('MongoDB disconnected!');
mongoose.connect(dbURI, {server:{auto_reconnect:true}});
});
mongoose.connect(dbURI, {server:{auto_reconnect:true}});
http://bites.goodeggs.com/posts/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup/ 에서 발췌.
이것은 저에게 효과가 있었습니다.
var mongoose = require('mongoose')
var mongoUrl = "mongodb://localhost:27017/test"
var connectWithRetry = function() {
return mongoose.connect(mongoUrl, function(err) {
if (err) {
console.error('Failed to connect to mongo on startup - retrying in 5 sec', err);
setTimeout(connectWithRetry, 5000);
}
});
};
connectWithRetry();
최근에, 저는 자동 재연결을 조사합니다.MongoDB
버르장머리 Mongoose
호출할 때 한 가지 문제가 있습니다.mongoose.connect
에 내에disconnected
이벤트 핸들러, 무한 루프를 트리거합니다.mongoose 자동 재연결 시 SIGINT 신호가 차단되는 이유
한 가지 해결 방법은 다음과 같습니다.mongoose.connect()
다▁only▁connect와 연결이 없을 됩니다.MongoDB
전에.그auto_reconnect
▁with▁make▁mongo와 다시 연결되도록 할 수 있습니다.MongoDB
코드스니펫입니다. 스니펫이 있습니다.여기 코드 조각들이 있습니다.
var mongoose = require('mongoose');
var isConnectedBefore = false;
var connect = function() {
mongoose.connect('mongodb://localhost/' + + 'test_dev', {server: { auto_reconnect: true }});
};
connect();
mongoose.connection.on('error', function() {
console.log('Could not connect to MongoDB');
});
mongoose.connection.on('disconnected', function(){
console.log('Lost MongoDB connection...');
if (!isConnectedBefore)
connect();
});
mongoose.connection.on('connected', function() {
isConnectedBefore = true;
console.log('Connection established to MongoDB');
});
mongoose.connection.on('reconnected', function() {
console.log('Reconnected to MongoDB');
});
// Close the Mongoose connection, when receiving SIGINT
process.on('SIGINT', function() {
mongoose.connection.close(function () {
console.log('Force to close the MongoDB conection');
process.exit(0);
});
});
단지 후세를 위해, 이러한 답변의 대부분이 오래된 것이기 때문에, 이제 nodejs mongodb 드라이버에 구워지기 때문에 더 이상 이 문제를 다룰 필요가 없습니다.kdmon 인용하기
...이제 mongoose로 구워지고 기본적으로 활성화됩니다.그러나 Mongoose는 기본적으로 30초 동안만 다시 연결을 시도했다가 포기한다는 것을 알면 유용할 수 있습니다.mongoose가 다시 연결을 시도하는 횟수를 늘리도록 server.reconnectTries 옵션을 설정합니다.예를 들어 mongoose에게 다음과 같이 재연결 시도를 멈추지 말라고 말할 수 있습니다.
mongoose.connect(uri, { server: { reconnectTries: Number.MAX_VALUE } });
@클라이브의 대답은 훌륭했습니다.그럼에도 불구하고, 사용 때문에mongoose
시도가 실패할 때마다 다음과 같은 경고를 받았습니다.
(노드:18123) 처리되지 않은 약속거부 경고:처리되지 않은 약속 거부(거부 ID: 1): MongoError: 첫 번째 연결 시 서버 [localhost:27017]에 연결하지 못했습니다.
ES6 버전(Promise 포함)
또한 이 버전에서는 화면(또는 로거)에 반복되는 메시지가 범람하지 않도록 재연결 사이에 약간의 시간 제한을 추가했습니다(완전한 선택 사항).
import mongoose from 'mongoose';
mongoose.Promise = Promise; // Set mongoose to use ES6 Promises.
const dbURI = 'mongodb://127.0.0.1:27017/myDb';
const reconnectTimeout = 5000; // ms.
function connect() {
mongoose.connect(dbURI, { auto_reconnect: true })
.catch(() => {}); // Catch the warning, no further treatment is required
// because the Connection events are already doing this
// for us.
}
const db = mongoose.connection;
db.on('connecting', () => {
console.info('Connecting to MongoDB...');
});
db.on('error', (error) => {
console.error(`MongoDB connection error: ${error}`);
mongoose.disconnect();
});
db.on('connected', () => {
console.info('Connected to MongoDB!');
});
db.once('open', () => {
console.info('MongoDB connection opened!');
});
db.on('reconnected', () => {
console.info('MongoDB reconnected!');
});
db.on('disconnected', () => {
console.error(`MongoDB disconnected! Reconnecting in ${reconnectTimeout / 1000}s...`);
setTimeout(() => connect(), reconnectTimeout);
});
connect();
연결 이벤트에 대한 추가 정보입니다.
다음은 연결 시도 간격을 최소 5초로 설정하는 Clive의 답변에 대한 개선 사항입니다.
var db = mongoose.connection;
var lastReconnectAttempt; //saves the timestamp of the last reconnect attempt
db.on('error', function(error) {
console.error('Error in MongoDb connection: ' + error);
mongoose.disconnect();
});
db.on('disconnected', function() {
console.log('MongoDB disconnected!');
var now = new Date().getTime();
// check if the last reconnection attempt was too early
if (lastReconnectAttempt && now-lastReconnectAttempt<5000) {
// if it does, delay the next attempt
var delay = 5000-(now-lastReconnectAttempt);
console.log('reconnecting to MongoDB in ' + delay + "mills");
setTimeout(function() {
console.log('reconnecting to MongoDB');
lastReconnectAttempt=new Date().getTime();
mongoose.connect(dbURI, {server:{auto_reconnect:true}});
},delay);
}
else {
console.log('reconnecting to MongoDB');
lastReconnectAttempt=now;
mongoose.connect(dbURI, {server:{auto_reconnect:true}});
}
});
Mongoose가 Mongo와 연결되는 유일한 방법이기도 합니다.저의 경우 Express에 세션을 저장하기 위해 connect-mongo를 사용하고 있지만 v0.4.0에서 기본적으로 auto_reconnect가 true로 설정되어 있지 않습니다.
@zangw 답변을 바탕으로 앱에 대한 이 데이터베이스 init 기능으로 완료했습니다.
const mongoose = require('mongoose')
const RETRY_TIMEOUT = 3000
module.exports = function initDB () {
mongoose.Promise = global.Promise
const options = {
autoReconnect: true,
useMongoClient: true,
keepAlive: 30000,
reconnectInterval: RETRY_TIMEOUT,
reconnectTries: 10000
}
let isConnectedBefore = false
const connect = function () {
return mongoose.connect(process.env.MONGODB_URL, options)
.catch(err => console.error('Mongoose connect(...) failed with err: ', err))
}
connect()
mongoose.connection.on('error', function () {
console.error('Could not connect to MongoDB')
})
mongoose.connection.on('disconnected', function () {
console.error('Lost MongoDB connection...')
if (!isConnectedBefore) {
setTimeout(() => connect(), RETRY_TIMEOUT)
}
})
mongoose.connection.on('connected', function () {
isConnectedBefore = true
console.info('Connection established to MongoDB')
})
mongoose.connection.on('reconnected', function () {
console.info('Reconnected to MongoDB')
})
// Close the Mongoose connection, when receiving SIGINT
process.on('SIGINT', function () {
mongoose.connection.close(function () {
console.warn('Force to close the MongoDB connection after SIGINT')
process.exit(0)
})
})
}
몇 가지 차이점이 있습니다.연결 닫기 문제를 방지하기 위해 몇 가지 옵션을 추가했습니다. 30번의 자동 재시도 후 다시 연결 안 됨, MongoError만:모든 작업에 대해 토폴로지가 삭제되었으며 다시 연결되지 않았습니다. 또한 처리되지 않은 약속 거부를 방지하기 위해 .catch after connect를 추가했습니다.)
재시도하는 동안 요청 차단 없이 여러 번 재시도하려면 설정해야 했습니다.bufferMaxEntries: 0
:
const dbUri = 'mongodb://localhost/some_db';
const dbOptions = {
useMongoClient: true,
autoReconnect: true,
reconnectTries: Number.MAX_VALUE,
bufferMaxEntries: 0
};
mongoose.connect(dbUri, dbOptions).catch(err => process.exit(1));
서류를 읽어보니 선택지가 틀리신 것 같네요.연결 옵션 문자열은 다음과 같아야 합니다.
mongoose.connect("mongodb://localhost:27017/db", {
socketOptions: {
// This option is on by default, but why not set it explicitly
autoReconnect: true
},
// This options is 1 second by default, its possible the ha
// takes longer than 30 seconds to recover.
reconnectInterval: 5000,
// This options is 30 by default, why not make it 60
reconnectTries: 60
})
이 페이지를 확인하십시오. http://mongoosejs.com/docs/api.html
2023년 업데이트:
통합 토폴로지는 이제 최신 mongodb 드라이버의 표준입니다.연결은 다르게 처리됩니다.mongoose를 사용하여 연결 끊김 이벤트를 수신할 수 있지만 다시 연결할 때는 필요하지 않습니다.
다시 연결 시도를 감시하려면 mongoose.connection.client(MongoDB v3 또는 v4 Client) 개체를 사용합니다.
client.on('serverHeartbeatFailed', (e) => {})
진행 중인 재연결 시도가 표시됩니다.기본값은 매 10초입니다.
몽구스는 여전히 사용할 수 있습니다.disconnected
또는error
사용자 지정 보고를 추가할 수 있습니다.
언급URL : https://stackoverflow.com/questions/16226472/mongoose-autoreconnect-option
'programing' 카테고리의 다른 글
Spring Web Security에서 Authentication EntryPoint의 목적은 무엇입니까? (0) | 2023.07.12 |
---|---|
시스템이 둘 다 있는 이유는 무엇입니까?Net.Http 및 시스템.Web.Http 네임스페이스? (0) | 2023.07.12 |
Android에서 옵션 메뉴를 조각에 추가하는 방법 (0) | 2023.07.12 |
join을 사용하여 "not in ()" SQL 쿼리를 쓰는 방법 (0) | 2023.07.12 |
Android가 텍스트 편집에 자리 표시자 텍스트 추가 (0) | 2023.07.12 |