【问题标题】:Mongoose connection events with createConnection使用 createConnection 的 Mongoose 连接事件
【发布时间】:2014-07-28 19:16:55
【问题描述】:

我不再使用默认连接,而是使用明确定义的连接。

我的代码正在运行,只是跟踪我的 mongo 连接状态的事件处理程序都没有触发。

我使用默认猫鼬连接时触发的事件。 (mongoose.connect)。

var mongoose = require('mongoose'),
    logger = require('../logger'),
    config = require('../config');  

mongoose.connection.on('connecting', function(){
    logger.info("trying to establish a connection to mongo");
});

mongoose.connection.on('connected', function() {
    logger.info("connection established successfully");
});

mongoose.connection.on('error', function(err) {
    logger.error('connection to mongo failed ' + err);
});

mongoose.connection.on('disconnected', function() {
    logger.log('mongo db connection closed');
})

var gracefulExit = function() {
    db.close(function(){
        logger.log("mongoose connection with db " + server + 'is closing');
        process.exit(0);
    });
};

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

var db = mongoose.createConnection(config.get('DB_URL'));
module.exports = db;

代码的问题是

  1. 没有事件处理程序正在触发。
  2. 甚至 SIGNT 和 SIGTERM 上的进程事件也没有触发。

我也试过

var db = mongoose.createConnection(config.get('DB_URL'));

db.on('connecting', function(){
    logger.info("trying to establish a connection to mongo");
});

但这也不会触发。

【问题讨论】:

  • 你试过用mongoose.connect代替mongoose.createConnection吗?
  • 我不想使用 monoose.connect 因为使用“默认”连接对我来说似乎是一种不好的做法。我想使用明确定义的连接而不是默认连接。
  • 好的,但这更像是标准做法。
  • 您使用db.on 的第二次尝试对我来说适用于“打开”、“连接”和“断开连接”事件。
  • 哈..是的,它不适用于连接..但适用于连接。但是为什么进程退出事件没有调用我的关闭方法?

标签: node.js mongoose


【解决方案1】:

这个sn-p打击对我来说很好

const connection = mongoose.createConnection(`mongodb://${process.env.MONGO_URI}`);

connection.on('connected', () => {
  console.log('connected to mongodb');
});

connection.on('disconnected', () => {
  console.log('connection disconnected');
});

【讨论】:

  • 也适合我。只是提到状态已经改变。不再有error 事件。这 5 个事件是唯一可用的:disconnectedconnectedconnectingdisconnectinguninitialized
【解决方案2】:

尝试:

mongoose.connection.on('open', function() {
    logger.info("database is ready now");
});

也临时删除 .close()

【讨论】:

    【解决方案3】:

    我自己偶然发现了这个问题,发现我需要在实际连接到数据库之前设置EventListeners,就像这样(使用异步/等待):

    export class Database {
      public static connect( databaseCredentials: string ) {
        return new Promise( async resolve => {
          // ! The `EventListeners` is setup here.
          mongoose.connection.on( "connected", () => {
            logger.info( "Database has connected successfully." );
          });
          mongoose.connection.on( "error", (error) => {
            logger.error( " Obs! There was an unexpected error connecting to the database.", error );
          });
    
          // ! The acutal connection to the database happens here.
          await mongoose.connect( databaseCredentials, {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            keepAlive: true,
            reconnectInterval: 500,
            connectTimeoutMS: 10000,
          });
    
          resolve();
        });
      }
    }
    

    这也应该与 mongoose.createConnections 以相同的方式工作。

    这将产生结果(如果成功):

    { message: 'Database has connected successfully.',
      level: 'info',
      timestamp: '2019-10-11T15:17:16.616Z' }
    

    我只是想插话并给出我手头问题的解决方案,并给出代码的完整示例实现,因为上面的答案没有解释你需要以什么顺序监听事件。如果您将mongoose.connection.on() 放在await.mongoose.connect() 下方,这将不会产生来自EventListeners 的任何响应。

    编辑:错别字

    【讨论】:

    • 这应该是正确的答案,在连接之前创建事件也适合我。
    【解决方案4】:

    我也遇到过这个问题,
    最后我解决了它,在我声明事件处理程序之前了解connect() / createConnection() 执行。 所以我的openconnected 事件处理程序将永远不会再次调用。

    因此,首先声明它们并在尝试连接之后 - 将解决您的问题!

    例如:

    try {
      mongoose.connection
        .on('error', err => {
          console.error(err);
        })
        .on('open', err => {
          console.log(`DB connected`);
        })
    
      await mongoose.connect('mongodb://localhost:27017/test', { useNewUrlParser: true });
    } catch (error) {
      handleError(error);
    }
    

    【讨论】:

      猜你喜欢
      • 2022-11-20
      • 1970-01-01
      • 1970-01-01
      • 2016-01-08
      • 2021-08-30
      • 1970-01-01
      • 2021-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多