如何处理Mongoose DB连接中断

我一直在评估Mongoose(一个使用MongoDB作为持久存储的node.js的ORM)。

我想要做的是确保当应用程序启动时数据库没有启动时,应用程序可以运行,并且智能地处理数据库。

目前我的testing应用程序不工作在这两种情况下是这样的:

var mongoose_connection = mongoose.createConnection(DATABASE_URL, {server:{poolSize:4}}); 

然后我在制作Models时使用这个连接。

在应用程序启动时数据库closures的情况下,对实例的任何save()调用都将自动失败,并且没有错误。 如果数据库恢复正常,他们永远不会被写入。

所以我需要检测连接从未发生过,并让应用程序能够在运行时告诉我,以便我能够以某种方式处理它。

当应用程序启动后数据库出现故障时,尽pipesave()调用仍然不会导致错误,但是它们在DB返回时排队并写入。

这似乎很好,除了我想挂钩的API来获取事件,当数据库closures,并查询有多less保存排队。 在某些时候,我可能会有很多排队的事件,我想停止制作新的应用程序,并让应用程序退出。

案例#1:数据库在应用程序启动。 有一个小错误阻止了我现在正在修复的这个用例。 不过,这里是解决方法:

 var db = mongoose.createConnection(); db.on('error', function (err) { if (err) // couldn't connect // hack the driver to allow re-opening after initial network error db.db.close(); // retry if desired connect(); }); function connect () { db.open('localhost', 'dbname'); } connect(); 

https://gist.github.com/2878607

一个丑陋但工作的要点 首先closuresmongo,然后运行这个要点。

注意连接失败。

然后启动mongo,看到所有排队的插入完成并转储到控制台。 写和发现将开始。

closuresmongo,注意插入和查找正在尝试,但没有执行callback。

重新启动mongo。 注意所有排队的插入和查找都已完成。

如果在数据库closures时,您宁愿让所有对服务器的请求失败,本机驱动程序也会发出可以在中间件中感知到的重新连接事件。

这工作,并发出重新连接事件罚款(mongodb本机驱动程序1.3.23)

 mongoose.connection.db.on('reconnect', function (ref) { connected=true; console.log('reconnect to mongo server.'); }); 

所以我的db连接中间件查找连接/错误/重新连接(一些事件是多余的,但不伤害! 以上aaronheckmann的答案,初始连接失败仍然需要重试来处理。

 mongoose.connection.on('open', function (ref) { connected=true; console.log('open connection to mongo server.'); }); mongoose.connection.on('connected', function (ref) { connected=true; console.log('connected to mongo server.'); }); mongoose.connection.on('disconnected', function (ref) { connected=false; console.log('disconnected from mongo server.'); }); mongoose.connection.on('close', function (ref) { connected=false; console.log('close connection to mongo server'); }); mongoose.connection.on('error', function (err) { connected=false; console.log('error connection to mongo server!'); console.log(err); }); mongoose.connection.db.on('reconnect', function (ref) { connected=true; console.log('reconnect to mongo server.'); });