В следующем коде MongoClient уже закрыт, когда выполняется функция обратного вызова collection.insert()
. Поэтому я ожидаю, что collection.insert()
не сработает и выдаст ошибку.
Но это работает, collection.insert()
работает нормально, даже когда MongoClient уже закрыт.
Как это возможно?
Мой код:
const MongoClient = require('mongodb').MongoClient,
connectionUrl = 'mongodb://localhost:27017';
myDatabase = 'library',
myCollection = 'books';
MongoClient.connect(connectionUrl, function(Connectionerror, client) {
if (Connectionerror) {
throw Connectionerror;
}
console.log("Successfully connected to server");
var database = client.db(myDatabase),
collection = database.collection(myCollection);
var book = {Author:"Mark Twain",Title:"Tom Sawyer"};
collection.insert(book,function(InsertionError,result){
if(!InsertionError) {
console.log("Success : "+result.ops.length+" book(s) inserted!");
} else console.log("An insertion error was encountered!");
});
client.close();
console.log();
console.log("Mongo Client is closed");
console.log();
});
Исполнение:
$ node app-test.js
Successfully connected to server
Mongo Client is closed
Success : 1 book(s) inserted!
Книга была вставлена ПОСЛЕ того, как клиент был закрыт. Как это возможно?
Теперь, с другой стороны, если есть два уровня обратных вызовов (collection.insert()
ниже collection.findOne()
), то возникает ошибка, как я и ожидал (MongoError : server instance pool was destroyed
):
const MongoClient = require('mongodb').MongoClient,
connectionUrl = 'mongodb://localhost:27017';
myDatabase = 'library',
myCollection = 'books';
MongoClient.connect(connectionUrl, function(Connectionerror, client) {
if (Connectionerror) {
throw Connectionerror;
}
console.log("Successfully connected to server");
var database = client.db(myDatabase),
collection = database.collection(myCollection);
var book = {Author:"Mark Twain",Title:"Tom Sawyer"};
collection.findOne(book,function(QueryError,bookToFind){
if(!QueryError) {
if (bookToFind != null) {
console.log("This book already exists !");
} else {
collection.insert(book,function(InsertionError,result){
if(!InsertionError) {
console.log("Success : "+result.ops.length+" books inserted!");
} else {
console.log("An insertion error was encountered!");
console.log(InsertionError.stack);
}
});
}
} else console.log("A request errror was encountered !");
});
client.close();
console.log();
console.log("Mongo Client is closed");
console.log();
});
Исполнение:
$ node app-test2.js
Successfully connected to server
Mongo Client is closed
An insertion error was encountered!
MongoError: server instance pool was destroyed
(...)