Почему функция обратного вызова все еще может вставляться в mongoDB, даже когда клиент закрыт? - PullRequest
0 голосов
/ 30 июня 2018

В следующем коде 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
(...)

1 Ответ

0 голосов
/ 30 июня 2018

Второй пример работает так же, как и первый. 1. Найти запрос выполняется. 2. Пока ответ не поступит из базы данных, выполняется client.close (). 3. Теперь, когда ответ получен по первому запросу, второй запрос выдаст исключение / ошибку, потому что шаг 2 закрыл соединение.

Infact ваш console.log отвечает на ваш собственный вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...