【问题标题】:Mongoose Trying to open unclosed connection猫鼬试图打开未关闭的连接
【发布时间】:2013-03-20 16:26:00
【问题描述】:

这是问题的简化版本,但基本上我正在尝试使用 mongoose 打开 2 个 mongodb 连接,它给了我“尝试打开未关闭的连接”。错误。

代码示例:

var db1 = require('mongoose');
db1.connect('my.db.ip.address', 'my-db');

var db2 = require('mongoose');
db2.connect('my.db.ip.address', 'my-db');

db2.connection.close();
db1.connection.close();

知道如何让它工作吗?

【问题讨论】:

  • @NilsH:用例:数据库连接由配置文件决定,使用不同环境(prod、staging、dev)的不同部分来创建应用程序与其运行环境之间的松散耦合。在 dev所有数据库都在本地主机上,因此易于管理;生产中的数据库位于具有不同复制设置等的不同机器上。

标签: node.js mongodb mongoose


【解决方案1】:

connect() 打开到数据库的默认连接。由于您需要两个不同的连接,请使用createConnection()

API 链接:http://mongoosejs.com/docs/api.html#index_Mongoose-createConnection

【讨论】:

  • 这在 mongolab 上不起作用,为 2 个数据库创建多个连接将导致 mongolab 中的 MongoError: database names cannot contain the character '.'
【解决方案2】:

添加 Raghuveer 答案:

我还要提一下,不要直接使用 mongoose(您可能会以这种方式使用它,最终会出现在这篇文章中):

require('mongoose').model(...);

您将使用返回的连接:

var db = require('mongoose').connect('xxx', 'yyy');
db.model(...);

【讨论】:

    【解决方案3】:

    我在运行测试时遇到了这个问题。

    这就是我为解决它所做的。

    //- in my app.js file.
    try {
        mongoose.connect('mongodb://localhost/userApi2'); //- starting a db connection
    }catch(err) {
        mongoose.createConnection('mongodb://localhost/userApi2'); //- starting another db connection
    }

    【讨论】:

    • 我还在用这个方法,而且有效!希望有人在投票后评论它有什么问题。
    • 我可以证明这确实适用于测试
    【解决方案4】:

    我在使用 mocha 进行单元测试时遇到了这个问题。

    当我添加第二个测试时出现问题,因为beforeEach 被调用了两次。

    我已经用这段代码解决了这个问题:

    const mongoose = require('mongoose');
    describe('Your test suite', () => {
        beforeEach( () => {
            if (mongoose.connection.db) {
                return; // or done();
            } else {
                // connect to mongodb
        });
    
        describe('GET /some-path', () => {
           it('It should...', () => {
    
           });
        });
    
        describe('POST /some-path', () => {
           it('It should...', () => {
    
           });
        });
    });
    

    希望对你有帮助!

    【讨论】:

      【解决方案5】:

      您正在尝试第二次打开默认连接(尚未关闭)。

      改为执行以下操作

      var db = require('mongoose'); //note only one 'require' needed.
      var connectionToDb1 = db.createConnection('my.db1.ip.address', 'my-db1');
      var connectionToDb2 = db.createConnection('my.db2.ip.address', 'my-db2');
      

      【讨论】:

        【解决方案6】:

        使用mongoose.disconnect(fn):

        mongoose.disconnect(() => {
        
          // here it would be possible "reset" models to fix 
          // OverwriteModelError errors
          mongoose.models = {};
        
          // here comes your logic like registering Hapi plugins
          server.register(somePlugin, callback);
        });
        

        我在输入错误消息时发现了这个问题,尽管我的问题有点不同,但我相信它可能对那些使用 Hapi 的人有用。更具体地说是Hapi + rest-hapi + mocha

        当使用--watch 选项运行mocha 时,我同时面临:OverwriteModelErrorError: Trying to open unclosed connection errors

        【讨论】:

          【解决方案7】:

          简单的解决方案 -

           Use mongoose.createConnection() instead of  mongoose.connect()
              
              Its occurs because of version issue
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2022-12-11
            • 2014-06-20
            • 1970-01-01
            • 2014-04-24
            • 2012-02-07
            • 1970-01-01
            • 2013-10-22
            相关资源
            最近更新 更多