복붙노트

[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. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    4.이러한 답변의 대부분은 나이로는 이제 nodejs MongoDB를 드라이버로 구운대로 그냥 후손을 위해, 당신은 더 많은 어떤이 문제를 처리 할 필요가 없습니다. kdmon을 인용합니다 :

    이러한 답변의 대부분은 나이로는 이제 nodejs MongoDB를 드라이버로 구운대로 그냥 후손을 위해, 당신은 더 많은 어떤이 문제를 처리 할 필요가 없습니다. kdmon을 인용합니다 :

    mongoose.connect(uri, { server: { reconnectTries: Number.MAX_VALUE } });
    
  5. ==============================

    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. ==============================

    6.확인 몽구스는 또한 몽고에 연결하는 유일한 방법입니다 확인하십시오. 내 경우에는, 내가 익스프레스에 저장 세션에 연결 - 몽고를 사용하고 있지만, v0.4.0의로, 기본적으로 true로 auto_reconnect가 설정되어 있지 않습니다.

    확인 몽구스는 또한 몽고에 연결하는 유일한 방법입니다 확인하십시오. 내 경우에는, 내가 익스프레스에 저장 세션에 연결 - 몽고를 사용하고 있지만, v0.4.0의로, 기본적으로 true로 auto_reconnect가 설정되어 있지 않습니다.

  7. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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));
    
  11. from https://stackoverflow.com/questions/16226472/mongoose-autoreconnect-option by cc-by-sa and MIT license