2012-12-31 3 views
3

Я большой новичок Node.js и Mongo, поэтому, пожалуйста, будьте осторожны.Mongodb (mongolab) Node.js ничего не нашел в коллекции

Так вот мой Node.js приложение:

var mongo = require('mongodb'); 
var Server = mongo.Server; 
var Db = mongo.Db; 

var server = new Server('hostname.mongolab.com', 666, {auto_reconnect : true}, {w:0, native_parser: false}); 
var db = new Db('dbName', server, {safe:true}); 

db.open(function(err, client) { 
    if(err) { return console.dir(err); } 
    client.authenticate('mongolabUser', 'mongolabUserPassword', function(authErr, success) { 
    if(authErr) { return console.dir(authErr); } 
    var stream = client.collection('myCollection').find({}).stream(); 
    stream.on('data', function(item) {console.log("Do something with item"); }); 
    stream.on('end', function() {console.log("Empty!");}); 
    }); 
    db.close(); 
}); 

Благодаря чудовищному использование заявлений отладчика, я пришел к выводу, что, кажется, не будет запустить client.authenticate. Похоже, что он вот-вот выполнит эту линию, но затем просто перепрыгнет через нее и перейдет прямо к db.close().

Но это только первая из моих проблем. В какой-то момент я смог подключиться к базе данных и выполнить проверку подлинности, но мой пользователь не извлекал ничего из команды find ({}). Я пробовал всевозможные способы, и потоки - это моя последняя попытка, прежде чем решиться отказаться от нее на данный момент.

Mongolab похоже на v2.0.7, моя установка mongo v2.2.1. Когда я использую инструмент командной строки для входа в систему как mongolabUser и выполняю команду типа db.myCollection.find(), я получаю все в своей коллекции, поэтому это не может быть проблемой с разрешениями.

Любые советы/предложения?

ответ

2

client.authenticate() является асинхронным, так что линия, которая называет его начинается аутентификации, но не ждет ответа сервера, прежде чем перейти к выполнению следующей строки, db.close(). Таким образом, к моменту, когда сервер отвечает, соединение было закрыто клиентом.

Перемещение db.close() внутри обработчика событий для stream.end help?

var mongo = require('mongodb'); 
var Server = mongo.Server; 
var Db = mongo.Db; 

var server = new Server('hostname.mongolab.com', 666, {auto_reconnect : true}, {w:0, native_parser: false}); 
var db = new Db('dbName', server, {safe:true}); 

db.open(function(err, client) { 
    if(err) { return console.dir(err); } 
    client.authenticate('mongolabUser', 'mongolabUserPassword', function(authErr, success) { 
    if(authErr) { return console.dir(authErr); } 
    var stream = client.collection('myCollection').find({}).stream(); 
    stream.on('data', function(item) {console.log("Do something with item"); }); 
    stream.on('end', function() { 
     console.log("Empty!"); 
     db.close(); 
    }); 
    }); 
}); 
+0

Святое дерьмо. ** Facepalm ** – MikeMac

Смежные вопросы