如何确保Node.js在MonogDB连接断开后继续运行?

Express中有一个error handling中间件,它试图捕获所有传入的错误:

app.use(function(err, req, res, next){ console.error(err.stack); res.status(500); res.render('500.jade'); }); 

但由于某种原因,每当我closuresmongod进程,我的应用程序崩溃与以下堆栈跟踪:

 Error: failed to connect to [localhost:27017] at null.<anonymous> (/<hidden>/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:540:74) at EventEmitter.emit (events.js:106:17) at null.<anonymous> (/<hidden>/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection_pool.js:140:15) at EventEmitter.emit (events.js:98:17) at Socket.<anonymous> (/<hidden>/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/connection.js:478:10) at Socket.EventEmitter.emit (events.js:95:17) at net.js:441:14 at process._tickCallback (node.js:415:13) Process finished with exit code 8 

我曾尝试使用以下configuration,但它并没有帮助我:

 var options = { server:{ auto_reconnect: true, poolSize: 10, socketOptions:{ keepAlive: 1 } }, db: { numberOfRetries: 10, retryMiliSeconds: 1000 } } mongoose.connect(config.db, options); 

有人可能会问:“为什么你希望你的应用程序在没有数据库连接的情况下运行?”。 我不希望它崩溃并重新启动。 Supervisor和Forever模块在尝试一定次数后似乎不再尝试重新连接,从而使应用程序处于崩溃状态。

理想情况下,当MongoDB崩溃时,我想向用户显示一个500.jade的错误页面,同时服务器应该每10秒钟不断尝试重新连接数据库。 重新连接后,恢复所有正常操作。

编辑:下面发布的解决scheme都没有为我工作,除域。

尝试初始化域中的数据库,这将捕获错误而不会崩溃

 var d = require('domain').create(); d.on('error', function(er) { console.log('Oh no, something wrong with DB'); }); d.run(function() { mongoose.connect(config.db, options); }); 

当某些事情崩溃时让服务器重新启动通常是一个好主意,但是由于您已经意识到这一点,并且想要避免这种情况,所以在域中封装任何失败的方法都是可行的。

这就是我所做的处理Mongo失败 – 将其添加为中间件。 它也会尝试重新连接。

 // Handler in case Mongo goes down app.use(function(req, res, next) { // We lost connection! if (1 !== mongoose.connection.readyState) { // Reconnect if we can mongoose.connect(config.db, options); res.status(503); throw new Error('Mongo not available'); } next(); }); 

这假设你有一个标准的50xerror handling程序,会向用户显示一个不错的页面。

重新连接是为了下一个用户/页面加载,以检查它是否备份。 工作很好。

当连接丢失时,MongoDB驱动程序发出“closures”事件。 你可以点击这个事件,并将该数据库标记为不可用,并根据该数据写入任何逻辑。

 db.on('close', function() { // handle the disconnect dbAvailable = false; }); 

如果您有兴趣,我有一个小的NPM模块来处理这个问题: https : //npmjs.org/package/mongoconnect