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的回调函数,其中包括一个由于客户机关闭而失败的插入。