[MONGODB] 몽구스 autoReconnect 옵션
MONGODB몽구스 autoReconnect 옵션
나는 몽구스를 통해 MongoDB의 자동 재 연결 기능을 설정하기 위해 노력하고있어. 내가 옵션을 전달하는 시도하는 모든 방법은 아무런 영향을 미치지 않았다, 또는 적어도 다시 연결 이벤트가 방출되지 않습니다.
나는 시도했다 :
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 } });
이들 중 하나가 올바른 경우 다시 연결 이벤트가 트리거되어야하고, 메시지가 콘솔에 로그인해야하지만이 발생하지 않습니다.
지연이 다시 연결하기 전에이 있다면, 누군가는 그것을 구성하는 방법을 알고 있나요?
미리 감사드립니다
이에보고 누군가를 위해, 이것 좀 봐와 몽구스 저장소에서이 문제를 가지고.
해결법
-
==============================
1.난 당신과 같은 질문을했고, robertklep의 솔루션 중 하나 나를 위해 작동하지 않았다. 내가 MongoDB의 서비스를 중지 할 때 오류 이벤트가 트리거 찾았지만 connection.readyState 여전히 1 (연결). 이 자동 재 연결하지 않았다 이유가 될 수있다.
난 당신과 같은 질문을했고, robertklep의 솔루션 중 하나 나를 위해 작동하지 않았다. 내가 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}});
-
==============================
2.http://bites.goodeggs.com/posts/reconnecting-to-mongodb-when-mongoose-connect-fails-at-startup/에서 뜯어 낸
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();
-
==============================
3.최근에, 나는 MongoDB를 var에 몽구스와 자동 재 연결을 조사합니다. 분리 이벤트 핸들러 내에서 mongoose.connect를 호출 할 때, 그것은 무한 루프를 트리거 여기에서 문제가있다. SIGINT 신호는 때 몽구스 자동 재 연결을 차단하는 이유.
최근에, 나는 MongoDB를 var에 몽구스와 자동 재 연결을 조사합니다. 분리 이벤트 핸들러 내에서 mongoose.connect를 호출 할 때, 그것은 무한 루프를 트리거 여기에서 문제가있다. SIGINT 신호는 때 몽구스 자동 재 연결을 차단하는 이유.
솔루션 주위에 하나의 작업 전에 MongoDB를와 아무 관련이 없을 때 mongoose.connect이 ()에만 호출하는 것이 될 수있다. auto_reconnect 플래그는 자동으로 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); }); });
-
==============================
4.이러한 답변의 대부분은 나이로는 이제 nodejs MongoDB를 드라이버로 구운대로 그냥 후손을 위해, 당신은 더 많은 어떤이 문제를 처리 할 필요가 없습니다. kdmon을 인용합니다 :
이러한 답변의 대부분은 나이로는 이제 nodejs MongoDB를 드라이버로 구운대로 그냥 후손을 위해, 당신은 더 많은 어떤이 문제를 처리 할 필요가 없습니다. kdmon을 인용합니다 :
mongoose.connect(uri, { server: { reconnectTries: Number.MAX_VALUE } });
-
==============================
5.@ 이브의 대답은 우수했다. 그럼에도 불구하고, 약속 I와 몽구스를 사용하기 때문에 모든 시도가 실패한 후 다음과 같은 경고를 받고 있었다 :
@ 이브의 대답은 우수했다. 그럼에도 불구하고, 약속 I와 몽구스를 사용하기 때문에 모든 시도가 실패한 후 다음과 같은 경고를 받고 있었다 :
또한 반복되는 메시지의 홍수되는 화면 (또는 로거)를 방지하기 위해,이 버전 (완전히 선택 사항)에 재접속 사이에 작은 시간 제한을 추가했다.
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();
연결 이벤트에 대한 자세한 정보를 제공합니다.
-
==============================
6.확인 몽구스는 또한 몽고에 연결하는 유일한 방법입니다 확인하십시오. 내 경우에는, 내가 익스프레스에 저장 세션에 연결 - 몽고를 사용하고 있지만, v0.4.0의로, 기본적으로 true로 auto_reconnect가 설정되어 있지 않습니다.
확인 몽구스는 또한 몽고에 연결하는 유일한 방법입니다 확인하십시오. 내 경우에는, 내가 익스프레스에 저장 세션에 연결 - 몽고를 사용하고 있지만, v0.4.0의로, 기본적으로 true로 auto_reconnect가 설정되어 있지 않습니다.
-
==============================
7.여기에 연결 시도 사이에 5 초의 최소 설정 이브의 대답에 대한 개선이다.
여기에 연결 시도 사이에 5 초의 최소 설정 이브의 대답에 대한 개선이다.
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}}); } });
-
==============================
8.워드 프로세서를 읽은 후, 나는 확신 당신이 옵션 잘못이 있어요. 연결 옵션 문자열은 다음과 같은 모양입니다 :
워드 프로세서를 읽은 후, 나는 확신 당신이 옵션 잘못이 있어요. 연결 옵션 문자열은 다음과 같은 모양입니다 :
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 :이 페이지를 체크 아웃
-
==============================
9.@zangw 답변에 따라, 나는 내 응용 프로그램이 데이터베이스 초기화 기능을 완료했습니다
@zangw 답변에 따라, 나는 내 응용 프로그램이 데이터베이스 초기화 기능을 완료했습니다
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 추가했습니다 :
-
==============================
10.다시 시도하는 동안 요청을 차단하지 않고 여러 시도를하기 위해 나는 설정 bufferMaxEntries에 있었다 : 0 :
다시 시도하는 동안 요청을 차단하지 않고 여러 시도를하기 위해 나는 설정 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));
from https://stackoverflow.com/questions/16226472/mongoose-autoreconnect-option by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB의 쉘에서 데이터베이스를 작성하지 (0) | 2020.01.18 |
---|---|
[MONGODB] $ 조회하여 MongoDB에서 $ 프로젝트 (0) | 2020.01.18 |
[MONGODB] MongoDB를 시작으로 실패 - fassert 후 중단 *** () 실패 (0) | 2020.01.15 |
[MONGODB] 어떻게 MongoDB를은 SQL 주입 혼란을 피하기는 무엇입니까? (0) | 2020.01.13 |
[MONGODB] 프로젝션 찾기 쿼리 작동하지 (0) | 2020.01.09 |