【问题标题】:When mongodb server is down how to catch the error while running mongoose query当 mongodb 服务器关闭时如何在运行 mongoose 查询时捕获错误
【发布时间】:2017-01-08 06:09:39
【问题描述】:

我正在使用 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 集群关闭时,我会在执行上面的 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);
        }
    });

【问题讨论】:

  • 您的应用程序是否开始挂起 - 不响应请求?

标签: node.js mongodb mongoose


【解决方案1】:

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

从猫鼬代码中找到here我们可以看到库数据库连接-connection.js

具有以下发出的事件: * @param {Mongoose} 以猫鼬实例为基础 * @inherits NodeJS EventEmitter

http://nodejs.org/api/events.html#events_class_events_eventemitter * @event connecting:在此连接上执行 connection.{open,openSet}() 时发出。

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

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

  • @event disconnectingconnection.close() 执行时发出。

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

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

  • @event reconnected:在我们 connected 和随后 disconnected 之后发出,随后又成功连接。

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

  • @event fullsetup:在副本集场景中发出,当主要和在 连接字符串中指定的至少一个辅助设备已连接。

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

当数据库关闭时,您将收到两个事件: 1. 断线 2.error(驱动遇到的错误)

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

因此,您无需尝试捕获错误,而是应该监听这些事件。

有关连接失败和重新连接的更多有用信息,请访问here

本文解释了如何根据您的设置使用和配置 autoReconnect 和 bufferMaxEntries。

【讨论】:

    猜你喜欢
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2023-02-11
    相关资源
    最近更新 更多