即使关闭了客户端,如何仍可以将回调函数插入mongoDB?

时间:2018-06-30 17:06:25

标签: node.js mongodb callback

在以下代码中,执行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
(...)

1 个答案:

答案 0 :(得分:0)

第二个示例与第一个示例相同。 1.查找查询被执行。 2.直到响应来自数据库client.close()才会执行。 3.现在,当第一个查询收到响应时,第二个查询将引发异常/错误,因为step2已关闭连接。

了解您的console.log会回答您自己的问题。