如何处理Mongoose DB连接中断

jus*_*nhj 12 mongoose mongodb node.js

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

我想要做的是确保应用程序可以在应用程序启动时数据库未启动时运行,并且还可以智能地处理数据库故障.

目前我的测试应用程序在两种情况下都不起作用:

var mongoose_connection = mongoose.createConnection(DATABASE_URL, {server:{poolSize:4}});
Run Code Online (Sandbox Code Playgroud)

然后我在制作模型时使用该连接.

如果数据库在应用程序启动时出现故障,那么对实例的任何save()调用都会无提示失败并且没有错误.如果数据库恢复,他们永远不会写.

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

当应用程序启动后数据库关闭时虽然save()调用仍然不会导致错误,但它们会排队并在数据库返回时写入.

这似乎很好,除了我想挂钩到API以在数据库关闭时获取事件并查询排队的存储数量.在某些时候,我可能会有这么多排队的事件,我想要停止制作新的事件并让应用程序退出.

aar*_*ann 12

案例#1:db在app启动时失败.有一个小错误阻止我正在修复这个用例.但是,这是解决方法:

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();
Run Code Online (Sandbox Code Playgroud)

https://gist.github.com/2878607

一个丑陋但有效的要点.首先关闭mongo,然后运行这个要点.

注意连接失败.

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

关闭mongo,注意正在尝试插入和查找但没有执行回调.

重启mongo.请注意,所有排队的插入和查找都已完成.


app*_*ics 5

如果您希望在db关闭时向服务器发出所有请求失败,则本机驱动程序会发出可以在中间件中感知的重新连接事件.

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

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

所以我的dbconnection中间件寻找连接/错误/重新连接(一些事件是多余的,但不会造成伤害!)PS.初始连接失败仍然需要通过重试来处理,如上面的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.');
});
Run Code Online (Sandbox Code Playgroud)