处理MongoError的好方法:服务器实例池被销毁

我用mongo连接池运行一个守护进程。 它运行良好的天,但最终崩溃,每一个后续请求得到这个错误:

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”对象。

这就是我们正在使用的 – 如果连接失败,它会在5秒后尝试重新连接。 它是为mongoose写的,但是我们只是在检测错误时重新运行连接,这应该在任何框架中完成。

 // 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); });