我正在运行一个带有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);
});