【问题标题】:MongoClient throw MongoError: server instance pool was destroyedMongoClient 抛出 MongoError: 服务器实例池被破坏
【发布时间】:2019-06-28 12:29:10
【问题描述】:

我在 SO 上看到这些帖子描述了这个错误。其中大多数是因为 JavaScript 是异步的,并且 mongoClient.close() 在回调之外调用。这不是我的情况,但我不知道还有什么原因。

const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://localhost:27017/";
const mongoClient = new MongoClient(url, {
    useNewUrlParser: true
});

module.exports = class Mongo {
    insertOne(article) {
        mongoClient.connect((err, client) => {
            const db = client.db('grabber');
            db.collection("zr").insertOne(article, (err, res) => {
                if (err) throw err;
                mongoClient.close();
            });
        });
    };
}

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    我观察到您在insertOne() 方法中打开mongoClient.connect(),并在该方法中调用mongoClient.close(),并将mongoClient 作为全局变量。

    我的直觉是:

    • 还有另一个调用mongoClient的方法被此方法关闭,或者
    • 你打了两次insertOne(article)

    我可以确认第二个原因最有可能。这是我尝试过的代码:

    const MongoClient = require('mongodb').MongoClient;
    const url = "mongodb://localhost:27017/";
    const mongoClient = new MongoClient(url, {
        useNewUrlParser: true
    });
    
    class Mongo {
        insertOne(article) {
            mongoClient.connect((err, client) => {
                const db = client.db('grabber');
                db.collection("zr").insertOne(article, (err, res) => {
                    if (err) throw err;
                    mongoClient.close();
                });
            });
        };
    };
    
    x = new Mongo()
    setTimeout(function() { x.insertOne({'a': 1}); }, 1000);
    setTimeout(function() { x.insertOne({'a': 2}); }, 2000);
    

    两个setTimeout 在那里确保两个insertOne() 被一个接一个地调用。结果:

    MongoError: server instance pool was destroyed
    

    按照您的代码当前的结构方式,每次调用insertOne() 时,节点驱动程序都会创建一个新的连接池。这不是最优的,并且会阻止节点驱动程序使用连接池。

    不要在insertOne() 内部调用mongoClient.connect(),而是在class Mongo 外部全局调用它。将全局连接对象(从mongoClient.connect() 返回的对象)而不是mongoClient 对象本身传递给您的insertOne() 方法。

    【讨论】:

      猜你喜欢
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 2015-09-03
      相关资源
      最近更新 更多