2016-11-09 2 views
1

Я запускаю демон с пулом соединений mongo. Она прекрасно работает в течение нескольких дней, но в конце концов он выходит из строя, и каждый последующий запрос получает эту ошибку:Хороший способ обработки MongoError: пул экземпляров сервера был уничтожен

MongoError: сервер экземпляра бассейн был разрушен

код похож на этот:

var MongoClient = require('mongodb').MongoClient; 
var express = require('express'); 
var app = express(); 

MongoClient.connect(config.mongo.url, function(err, db) { 

    app.use('/', function(req, res, next) { 
     db.collection('somecollection').find({}).toArray(function(err, result) { 
      console.log(result); 
     }); 
    }) 

    var server = require('http').Server(app); 
    server.listen(config.worker.port, function() { 
     var address = server.address(); 
     logger.info({ 
      address: address.address, 
      port: address.port 
     }, 'New Worker created'); 
    }); 
}); 

возобновления процесса исправления проблема, но я хотел бы, чтобы приложение каким-то образом элегантно подключилось и перезапустило объект «db».

ответ

1

Это то, что мы используем - если соединение не удается, он пытается подключиться через 5 секунд. Это написано для мангуста, но мы просто перезапускаем соединение при обнаружении ошибки, что должно быть сделано для любой структуры.

// Connect to mongodb 
    const connect = function() { 
     const options = {server: {socketOptions: {keepAlive: 1}}}; 
     mongoose.connect(config.db, options); 
    }; 
    connect(); 

    mongoose.connection.on('error', err => { 
     let stack; 
     if (err) { 
      stack = err.stack; 
     } 
     winston.error('Mongo crashed with error', {err, stack}); 
    }); // eslint-disable-line no-console 
    mongoose.connection.on('disconnected',() => { 
     setTimeout(connect, 5000); 
    }); 
+1

Я попытаюсь посмотреть, смогу ли я заставить его работать с использованием событий в стандартном драйвере. Единственный кандидат: http://mongodb.github.io/node-mongodb-native/2.2/api/Db.html#event:error –

+0

@phraktal: Вы можете послушать это событие? я просматриваю документы, но до сих пор не могу понять, как слушать ошибку для родного драйвера. Пожалуйста посоветуйте, спасибо :) – chaintng

Смежные вопросы