我是一个大的node.js和mongo新手,所以请温柔一点。
下面是我的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({})命令中没有检索任何内容。我尝试了各种方法,在决定暂时放弃之前,streams是我的最新尝试。
Mongolab似乎在v2.0.7上,我的Mongo安装是v2.2.1。当我使用命令行工具以蒙古人身份登录并执行诸如db.my collection.find()之类的命令时,我会获取集合中的所有内容,因此权限不会有问题。
有什么建议吗?

最佳答案

client.authenticate()是异步的,因此调用它的行将启动身份验证,但在继续执行下一行之前不会等待服务器响应。所以当服务器响应时,客户端已经关闭了连接。
db.close()的事件处理程序中移动db.close()是否有帮助?

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();
    });
  });
});

07-28 02:42
查看更多