处理从nodejs到mongo db的丢失连接

时间:2014-01-21 21:21:37

标签: node.js mongodb connection timeout node-mongodb-native

我试图在nodejs和mongodb服务器之间连接丢失时“连接丢失”或类似的东西。 我使用本机驱动程序并具有以下代码

var mongo = require('mongodb');
var server = new mongo.Server('host', 'port', {
    auto_reconnect: true,
    socketOptions: {
        keepAlive: 10,
        connectTimeoutMS: 1000,
        socketTimeoutMS: 0
    }
});
var db = new mongo.Db(
    'dbname',
    server,
    {
        w: 1,
        wtimeout: 1000,
        numberOfRetries: 100,
        auto_reconnect: true
    }
);

db.on('close', function () {
    console.log('Error...close');
});
db.on('error', function (err) {
    console.log('Error...error', err);
});
db.on('disconnect', function (err) {
    console.log('Error...disconnect', err);
});
db.on('disconnected', function (err) {
    console.log('Error...disconnected', err);
});
db.on('parseError', function (err) {
    console.log('Error...parse', err);
});
db.on('timeout', function (err) {
    console.log('Error...timeout', err);
});

db.collection('collectionName',function(err, collection){
    if(err){
        console.log('Error...collection', err);
        return;
    }

    // set breakpoint here and break connection to mongo db server  
    collection.insert({}, function (err, data) {
        if (err) {
            console.log('Error...insert', err);
        }
        console.log('Fine!');
    });
});

大约20分钟没有超时或错误,插入被冻结。之后我得到“错误...插入”,连接丢失错误。

我试图设置socketTimeoutMS = 10000和keepAlive = 1,但是socketTimeoutMS在10000之后不断上升“超时”事件并且没有考虑keepAlive设置甚至是对mongodb的查询。

此外,只有当我们连接到mongodb服务器并且具有长时间查询时,wtimeout才有效。如果连接丢失则不起作用。

那么当我丢失连接时,如何才能获得事件或错误?或者减少20分钟的查询冻结?

2 个答案:

答案 0 :(得分:3)

如果mongodb服务器进程正在运行,请运行此示例。 之后,如果您停止服务器进程,则会看到Error...close正在显示。 " on"的所有可能事件功能可以是found here

var MongoClient = require('mongodb').MongoClient;

// Connect to the db
MongoClient.connect('mongodb://localhost:27017/exampleDb', function(err, db) {
  if(err) {
    return console.dir(err);
  }
  console.log('We are connected');
  // db.close();
  db.on('close', function () {
    console.log('Error...close');
  });
});

答案 1 :(得分:0)

查看以下内容: https://thecodebarbarian.com/managing-connections-with-the-mongodb-node-driver.html

最大的问题是驱动程序将永远缓冲查询,并且在连接恢复之前永远不会返回而不是失败,如果人们不了解,这可能会挂起程序的执行。