【问题标题】:How can I handle timeout errors in MongoClient?如何处理 MongoClient 中的超时错误?
【发布时间】:2019-06-28 21:56:02
【问题描述】:

我正在使用以下命令将 nodejs 应用程序连接到我的 mongodb 数据库:

const url = 'mongodb://localhost:27017/?replicaSet=rs'
let client = new MongoClient(url, { 
  useNewUrlParser: true,
  connectTimeoutMS: 60000,    
  socketTimeoutMS: 60000, 
 })
try {
  let dbclient = await client.connect()
  console.log(dbclient)
  const db = dbclient.db('test')
  const collection = db.collection('accounts')
  const changeStream = collection.watch(pipeline)
  changeStream.on("change", function(change) {
    console.log('changed', change)
  })
} catch (err) {
  console.log('mongo err:', err)
}

这工作得很好,但是它经常在几分钟后失去连接并出现错误:

未捕获的 MongoNetworkError:连接 6 到 localhost:27017 超时

根据the documentation,它应该会在出错时自动重新连接多达 30 次尝试,但它似乎不会再尝试重新连接。

我还需要在重新连接时运行一些额外的逻辑以正确处理本地状态。

如何捕捉和处理这些错误?

编辑:虽然我仍然没有收到其他事件,但在错误发生后我收到了“重新连接”事件。所以看起来我至少可以对错误做出反应,但实际上仍然无法捕捉到它们。

【问题讨论】:

  • 只需添加连接keepAlive: true,或特定时间keepAlive: 300000
  • 将其设置为 true 似乎可以解决问题,谢谢!
  • 我会将其添加为答案。也许有人会觉得它有帮助。
  • 您是否尝试过设置bufferMaxEntries:0,以便您断开连接后操作会失败?
  • @Thebluefish 运气好吗?

标签: node.js mongodb


【解决方案1】:

我建议您添加reconnectTries,它充当服务器尝试重新连接#times,并添加其他可以稳定连接的选项,然后您将代码修改回:

const url = 'mongodb://localhost:27017/?replicaSet=rs'
let client = new MongoClient(url, { 
  useNewUrlParser: true,
  connectTimeoutMS: 30000,    
  socketTimeoutMS:  360000, 
  useMongoClient: true,
  keepAlive: true,
  reconnectTries: 30
 })
try {
  let dbclient = await client.connect()
  console.log(dbclient)
  const db = dbclient.db('test')
  const collection = db.collection('accounts')
  const changeStream = collection.watch(pipeline)
  changeStream.on("change", function(change) {
    console.log('changed', change)
  })
} catch (err) {
  console.log('mongo err:', err)
}

【讨论】:

    【解决方案2】:

    试试这个

    var MongoClient = require('mongodb').MongoClient;
     var mongo = {};
     mongo.init = function() {
     MongoClient.connect('mongodb://localhost:27017/db',function(err, db) {
        if (err) {
          console.log('Err',err);
        } else {
          mongo.DB = db;
        }
        db.on('reconnect', function() {
          mongo.DB = db;
        });
      }
    }
    

    【讨论】:

    • 处理reconnect 事件无助于处理错误本身。另外,我不确定在这种情况下如何正确处理更改流。当reconnect 事件触发且未发生错误时,更改流仍会接收事件。但是,当事件在错误后触发时,它不会。在处理reconnect 事件时,我没有找到区分两者的好方法。理想情况下,我希望自己处理实际错误。
    【解决方案3】:

    只需添加连接keepAlive: true,或特定时间keepAlive: 300000

    在此处查看示例:https://ide.c9.io/ibrahimth/mongo

    const MongoClient = require('mongodb').MongoClient;
    const assert = require('assert');
    
    // Connection URL
    const url = 'mongodb://localhost:27017/?replicaSet=rs'
    // Database Name
    const dbName = 'test';
    
    // create a client, passing in additional options
    const client = new MongoClient(url, {
       keepAlive: true,
      connectTimeoutMS: 60000,    
      socketTimeoutMS: 60000, 
    });
    
    // Use connect method to connect to the server
    client.connect(function(err) {
      assert.equal(null, err);
      console.log("Connected correctly to server");
    const db = client.db(dbName);
    createCollated(db, function() {
        client.close();
      });
    
    
    });
    
    
    function createCollated(db, callback) {
      db.createCollection('acount',
        {
          'collation' :
            { 'acountnam': 'firstacount' }
        },
    
        function(err, results) {
          console.log("Collection created.");
          callback();
        }
      );
    };
    

    欲了解更多信息:http://mongodb.github.io/node-mongodb-native/3.0/tutorials/collations/

    【讨论】:

    • 其实今天终于又遇到了这个问题,使用了这个修复。有趣的是,我现在收到的错误略有不同,错误包含在一个对象(键:名称、消息、堆栈)中,而不仅仅是一条普通消息。不过还是没找到办法。
    • @Thebluefish 尝试这样做 socketTimeoutMS: 3000000, connectionTimeoutMS: 3000000, keepAlive:3000000
    • 我认为增加现有超时不会帮助我处理出现的这些错误。它们可能会导致它们发生的频率降低,但实际上我需要在它们发生时正确处理它们。
    • @Thebluefish 我发现这可能会有所帮助:stackoverflow.com/questions/18688282/…
    • 我已经尝试在几乎所有我能想到的与连接相关的事情上收听“关闭”和“错误”事件,但它们似乎都没有受到影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 2017-04-07
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多