当mongodb服务器关闭时如何在运行mongoose查询时捕获错误

时间:2016-08-31 15:08:30

标签: node.js mongodb mongoose

我使用mongoose将node.js与mongoDB连接,现在我写下面的查询

var trans = new transmodel({method: method, trans_id: r});
  trans.save(function(err) {
      if (err) {
            console.error("Razor_pay_webhook Error 4 err: " + err);
            res.write('statusCode: 200');
            res.end();
     } else {
        res.write('statusCode: 400');
        res.end();
     }
  });

我想当我的mongodb群落下来然后我会得到错误的#39;在执行上面的mongoose查询时,但当我在我的mongo集群关闭时运行上面的查询时没有发生任何事情(没有错误被调用)。任何人都可以告诉我如果我的mongodb服务器在我的查询中,我怎么能抓住错误。另外,为了再次与我的群集重新连接,我设置了以下参数,但我的节点服务器没有尝试再次与我的mongodb服务器重新连接,我不知道出了什么问题。

var mongoose = require('mongoose');
    var config = require('./config/database.js');
    var DB_URL = config.db.url;

    mongoose.connection.on("connected", function(ref) {
        console.log("Connected to " + " DB!");
    });

    mongoose.connection.on("error", function(err) {
        console.error('Failed to connect to DB ' + ' on startup ', err);
        if (err) {
            return next(err);
        }
    });

    mongoose.connection.on('disconnected', function(err) {
        console.log('Mongoose default connection to DB :' + ' disconnected');
        if (err) {
            return next(err);
        }
    });

    var gracefulExit = function() { 
        mongoose.connection.close(function () {
            console.log('Mongoose default connection with DB :'  + ' is disconnected through app termination');
            process.exit(0);
        });
    }

    process.on('SIGINT', gracefulExit).on('SIGTERM', gracefulExit);

    exports.con_close = function () {
        console.log('Mongoose connection disconnected');
        mongoose.connection.close();
    }

    var options = {
        server: {
            socketOptions: {
                keepAlive: 1000,
                connectTimeoutMS: 30000
            }
        },
        replset: { 
            rs_name: 'replicaset',
            auto_reconnect:true,
            socketOptions: {
                keepAlive: 1000, // doubt about it
                connectTimeoutMS: 30000
            } 
        },
        user: 'root',
        pass: 'G3saGT2Y',
        auth: {
            authdb: 'admin'
        }
    }

    mongoose.connect(DB_URL, options, function(err) {
        console.log('ho rha hai');
        if (err) {
            console.log('error connection to mongo server!');
            console.log(err);
        }
    });

1 个答案:

答案 0 :(得分:1)

您正在使用mongoose,它会在数据库关闭时以及数据库重新连接并重新启动时发出事件(EventEmitter模式)。

从找到的{mongoose代码<{3>}我们可以看到库db连接 - here

发出以下事件:  * @param {Mongoose}基于一个猫鼬实例  * @inherits NodeJS EventEmitter

connection.js  * @event connecting:在此连接上执行connection.{open,openSet}()时发出。

  • @event connected:此连接成功连接到数据库时发出。可能会在reconnected场景中以多次次发出。

  • @event open:在所有这些连接模型上执行connectedonOpen后发出。

  • @event disconnecting:执行connection.close()时发出。

  • @event disconnected:与数据库断开连接后发出。

  • @event close:我们在所有这些连接模型上执行disconnectedonClose后发出。

  • @event reconnected:在我们connected之后disconnected之后发出,然后成功发送另一个成功的连接。

  • @event error:在此连接上发生错误时发出。

  • @event fullsetup:在副本设置场景中发生,主要和在 连接字符串中指定的至少一个seconaries已连接。

  • @event all:在连接字符串中指定的所有节点连接时,在副本集方案中发出。

当数据库关闭时,您将收到两个事件: 断开连接 2.错误(驱动程序遇到的错误)

当数据库再次启动时,您将收到重新连接事件。

因此,您不需要尝试捕捉错误,而应该听取这些事件。

可以找到有关连接失败和重新连接的更多有用信息http://nodejs.org/api/events.html#events_class_events_eventemitter

本文介绍如何根据您的设置使用和配置autoReconnect和bufferMaxEntries。