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();
});
не возвращает никаких результатов
Я не вижу ничего плохого, и никаких ошибок не возвращается. Пожалуйста, сообщите
Ответы
Ответ 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