我看到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();
});
});
};
}
我注意到,您在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()
方法。