Подтвердить что ты не робот

Node.js запрос MongoDB не возвращает результаты

Я играл с mongodb и ввел некоторые тестовые данные {name: "david" } в коллекцию пользователей. Я проверил, что данные были в MongoDB, используя оболочку mongo, набрав

db.users.find()

результат:

{ "name":"david" }

В node.js script приведен следующий код:

db.open(function(err, db) {
    if (!err) {
        console.log("db opened!");
    }
    else {
        console.log(err);
    }
    db.collection('users', function(err, collection) {
        collection.find({}, function(err, cursor) {
            cursor.each(function(err, item) {
                console.log(item);
            });
        });
    });
    db.close();
});

не возвращает никаких результатов

Я не вижу ничего плохого, и никаких ошибок не возвращается. Пожалуйста, сообщите

4b9b3361

Ответ 1

Фактически вы закрываете соединение с базой данных до того, как данные из коллекции вернутся.

db.collection('users', function(err, collection) {
  collection.find({}, function(err, cursor) {
    cursor.each(function(err, item) {
      console.log(item);
    });

    // our collection has returned, now we can close the database
    db.close();
  });
});

Ответ 2

Поскольку CJohn правильно заявляет, вы закрываете соединение с БД, прежде чем извлекаете данные. Я знаю, что это не похоже на это, но это имеет место с структурой Node и обратными вызовами. Код для правильной обработки:

db.open(function(err, db) {
    if (err) return console.log('error opening db, err = ', err);

    console.log("db opened!");

    db.collection('users', function(err, collection) {
        if (err) return console.log('error opening users collection, err = ', err);

        collection.find({}, function(err, cursor) {
            if (err) return console.log('error initiating find on users, err = ', err);

            cursor.each(function(err, item) {
                // watch for both errors and the end of the data
                if (err || ! item) {
                    // display (or do something more interesting) with the error
                    if (err) console.log('error walking data, err = ', err);

                    // close the connection when done OR on error
                    db.close();

                    return;
                }
                console.log(item);
            });
        });
    });
});

Ответ 3

Попробуйте обновить версию node до последней версии.

sudo npm cache clean -f
sudo npm install -g n
sudo n stable

версия 0.4 может работать неправильно.

Ответ 4

Этот образец отлично работает в моем примере node/mongo. Функция получает обратный вызов, который принимает err, collection. Он получает коллекцию пользователей и в случае успеха вызывает поиск коллекции и преобразует ее в массив, но вы также можете выполнять итерацию на курсоре.

Внутри вызовов db.collection и connect.find вы не проверяете ошибки и обработку. Вы делаете это только при открытом вызове.

Кроме того, вы не должны вызывать db.close(), особенно если вы открываете с помощью пул соединений пула (вы не хотите для открытия и закрытия соединения при каждом вызове). Если вы хотите закрыть, а затем закройте обратный вызов.

Что-то вроде:

var server = new Server(host, port, {auto_reconnect: true, poolSize: 5}, {});

MyStore.prototype.getUsers = function(callback) {
server.open(function(err, db) {
    if (err) {
        callback(err);
    }
    else {
        db.collection('users', function(err, collection) {
            if( err )
                callback(err);
            else {
                collection.find().toArray(function(err, users) {
                    if (err) {
                        callback(err)
                    } else {
                        callback(null, users);
                    }
                });
            }
        }
    }});

Вот еще один учебник по node + mongo, который может помочь: http://howtonode.org/express-mongodb