在以下代码中,执行collection.insert()
的回调函数时,MongoClient已经关闭。因此,我期望collection.insert()
无法正常工作并引发错误。
但是它可以正常工作,即使 MongoClient 已经关闭,collection.insert()
也可以正常工作。
这怎么可能?
我的代码:
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
(...)
答案 0 :(得分:0)
第二个示例与第一个示例相同。 1.查找查询被执行。 2.直到响应来自数据库client.close()才会执行。 3.现在,当第一个查询收到响应时,第二个查询将引发异常/错误,因为step2已关闭连接。
了解您的console.log会回答您自己的问题。