Node.js 为什么即使客户端关闭,回调函数仍然可以插入mongoDB?
在下面的代码中,当执行Node.js 为什么即使客户端关闭,回调函数仍然可以插入mongoDB?,node.js,mongodb,callback,Node.js,Mongodb,Callback,在下面的代码中,当执行collection.insert()的回调函数时,MongoClient已经关闭。所以我希望collection.insert()不起作用并抛出一个错误 但是它工作正常,collection.insert()即使在MongoClient已经关闭的情况下也可以正常工作 这怎么可能 我的代码: const MongoClient = require('mongodb').MongoClient, connectionUrl = 'mongodb://loc
collection.insert()
的回调函数时,MongoClient已经关闭。所以我希望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!
$ node app-test2.js
Successfully connected to server
Mongo Client is closed
An insertion error was encountered!
MongoError: server instance pool was destroyed
(...)
已在客户端关闭后插入该书。这怎么可能
现在,另一方面,如果有两个级别的回调(在collection.findOne()
下有一个collection.insert()
),那么它会引发一个错误,正如我所预期的那样(MongoError:server instance pool已销毁
):
执行:
$ node app-test.js
Successfully connected to server
Mongo Client is closed
Success : 1 book(s) inserted!
$ node app-test2.js
Successfully connected to server
Mongo Client is closed
An insertion error was encountered!
MongoError: server instance pool was destroyed
(...)
第二个示例的工作原理与第一个相同。1.执行查找查询。2.直到数据库client.close()发出响应为止。3.现在,当第一个查询收到响应时,第二个查询将抛出异常/错误,因为步骤2已关闭连接
事实上,您的console.log回答了您自己的问题。因为您的插入查询在close call之前,这就是插入数据的原因。。。这不取决于回调…谢谢Anthony。我相信
collection.insert()
的回调函数会在close
调用之后执行。无论如何,我用另一个示例更新了我的问题,即collection.insert()
调用下的collection.findOne()
调用。这一次我得到了一个MongoError:server实例池被破坏了,这正是我所期望的。那么,为什么第一个案例有效,而第二个案例无效呢?同样,因为您在结束之前首先调用insert。在第二种情况下,客户端接收findOne,然后关闭,然后插入。对findOne的调用不包括对insert的调用-对insert的调用仅在findOne完成后进行。这些方法是不同步的(因此回调!),因此插入被添加到事件循环任务列表中,但是在这个任务列表中——插入之前——是对关闭的调用。我误解了回调函数的使用(这是我使用Javascript/Node.js的第一步)。现在我明白了:在第一个示例中,调用insert,然后关闭客户机,然后调用insert的回调。在第二个示例中也是一样,调用findOne,关闭客户机,并调用findOne的回调函数,其中包括一个由于客户机关闭而失败的插入。