如何处理MongoClient中的超时错误?

时间:2019-02-05 05:47:26

标签: node.js mongodb

我正在使用以下命令将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:27017超时

根据the documentation,它应自动重新连接多达30次尝试错误,但是似乎没有做出任何进一步的尝试来重新连接。

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

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

编辑:虽然我仍然没有收到其他事件,但是在发生错误之后我得到了“重新连接”事件。因此,看来我至少可以对错误做出反应,但仍然无法真正抓住它们。

3 个答案:

答案 0 :(得分:3)

只需添加到连接dialogRef.afterClosed().subscribe(result => { console.log('The dialog was closed'); console.log(result); // this.buttonClick.emit(this.enable=false); if (result === true) { this.displayBanner () this.showItem = false; } }); 或特定时间keepAlive: true

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

keepAlive: 300000

有关更多信息:http://mongodb.github.io/node-mongodb-native/3.0/tutorials/collations/

答案 1 :(得分:0)

尝试一下

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;
    });
  }
}

答案 2 :(得分:0)

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

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)
}