MongoDB / Mon goose необработанная ошибка при отключении - почему она не срабатывает при событии («ошибка»)? - PullRequest
0 голосов
/ 15 января 2020

Я подключаюсь к базе данных MongoDB с помощью библиотеки mon goose.

После запуска mongoose.connect() я создаю обработчик mongoose.connection.on('error').

После запуска приложения Я остановил службу MongoDB для имитации «события потери соединения». Сценарий выводит:

events.js:196
    throw er; // Unhandled 'error' event
    ...

и мое приложение падает.

Обработчик on ('error') никогда не выполняется. Почему бы нет? Не в этом ли смысл этого обработчика событий: обрабатывать ошибки, которые выдает соединение MongoDB, чтобы избежать сбоя приложения?

Ожидаемое поведение: если соединение MongoDB потеряно, приложение пытается повторно подключиться бесконечно.

Что я делаю не так?

Вот мой полный код подключения:

function dbConnect() {
// Establish MongoDB connection
    logger.debug(`Connecting to MongoDB database ${process.env.DB_SERVER}:${process.env.DB_PORT} database ${process.env.DB_DATABASE}...`)

    // Set up connection string
    const db_uri = `mongodb://${process.env.DB_USER}:${process.env.DB_PASS}@${process.env.DB_SERVER}:${process.env.DB_PORT}/${process.env.DB_AUTH_DATABASE}`

    // Initiate connection:
    mongoose.connect(db_uri, { 
        dbName: process.env.DB_DATABASE,        // Connect to the specified database
        useNewUrlParser: true,                  // Use new settings
        useUnifiedTopology: true,
        useCreateIndex: true,
        autoIndex: process.env.DB_AUTO_INDEX,   // Autoindex
        reconnectTries: Number.MAX_VALUE,       // Keep retrying forever (thanks https://stackoverflow.com/a/39684734/1502289 and https://stackoverflow.com/a/41923785/1502289)
        reconnectInterval: 5000,                // Time to wait between reconnection attempts
    })
    .then(() => {
        logger.debug("MongoDB successful connection")
    })
    .catch((err) => {
        logger.debug("MongoDB connection error", err)
    })

    const db = mongoose.connection

    // Set up database event handlers:
    db.on('error', function(err) { logger.error("Unable to connect to database.  Error: " + err) } )

    db.once('open', function() { 
        logger.debug('Mongoose database connection established.')

        // Load common properties from database:

        // ... [snip]

    })

    db.on('disconnected', function() {
        logger.error('MongoDB disconnected.  Attempting to reconnect...')
    })

    db.on('reconnected', function() { logger.debug('Mongoose reconnected.')})
}
...