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 に答える