3

我是一个大的 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({}) 命令中没有检索到任何内容。我尝试了各种方法,流是我决定暂时放弃之前的最新尝试。

Mongolab好像是在v2.0.7上,我的mongo安装的是v2.2.1。当我使用命令行工具以 mongolabUser 身份登录并执行 db.myCollection.find() 之类的命令时,我会在我的集合中获取所有内容,因此这不会是权限问题。

有什么建议/建议吗?

4

1 回答 1

2

client.authenticate()是异步的,因此调用它的行开始身份验证,但在继续执行下一行之前不等待服务器响应,db.close(). 因此,当服务器响应时,客户端已关闭连接。

移动db.close()事件处理程序内部是否有stream.end帮助?

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();
    });
  });
});
于 2012-12-31T21:36:49.780 回答