MongoClient扔MongoError:服务器实例池被破坏

问题描述 投票:0回答:1

我看到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个回答
1
投票

我注意到,您在mongoClient.connect()方法打开insertOne(),而且该方法中调用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()被调用。这不是最优的,并且防止驱动器节点利用连接池。

与其说mongoClient.connect()insertOne()的,全球范围内把它class Mongo之外。通过全球连接对象(从mongoClient.connect()返回的对象),而不是mongoClient对象本身你insertOne()方法。

© www.soinside.com 2019 - 2024. All rights reserved.