2012-04-05 17 views
0

nodejs mnogdb-nativeドライバを使用してmongodbからデータを取得しようとしています。 mongodコンソールは、接続が成功したことを示します。残念なことに、収集とログメッセージを 'findOneの前に'コンソールに取得した後、何も起こりませんでした。 findOneメソッドが返さないようです。mongoeのfindOneメソッドnetherが実行されず失敗する

var mongo = require('mongodb'), 
    config = require('./config'); 

var UserProvider = function() { 
    this.db = new mongo.Db('chatbox', 
     new mongo.Server(config.mongoServer, config.mongoPort, {auto_reconnect: true}), {}); 
    this.db.open(function() {}); 
}; 

UserProvider.prototype.getCollection = function(callback) { 
    this.db.collection('users', function(error, collection) { 
    if (error) { 
     callback(error); 
    } 
    else { 
     callback(null, collection); 
    } 
    }); 
}; 

UserProvider.prototype.validateUser = function(username, password, callback) { 
    this.getCollection(function(error, collection) { 
     if (error) { 
      console.log('error'); 
      callback(error); 
     } 
     else { 
      console.log('before findOne'); 
      collection.findOne({login: username, password: password}, function(error, item){ 
       console.log('done'); 
       if (error) { 
        callback(error); 
       } 
       else { 
        callback(null, item != null); 
       } 
      }); 
     } 
    }); 
}; 

module.exports = UserProvider; 

誰かが問題点を指摘できますか?

答えて

0

あなたのコードを使用するコードを見てみましょう:

var myProvider = require('yourcode').UserProvider; 

myProvider.validateUser('me','pwd', function(error, success) { 
    console.log("Success: " + success); 
}); 

私はmyProvider.validateUserされたら、私はthis.db.open()が戻ったことを保証するのですか?通常、この全体は逐次的です。しかし、Node.JSでは、そのdb.open()はブロックされません。コールがDBに送られてコードが実行され続けるので、実際に競合状態になります。

+0

はい、私はすでにそれを実現しましたが、とにかく感謝します。私はイベント駆動型の世界への初心者だったので、私は明白な事を見ていない。 – koss

2

暗闇の中で実際にポークしますが、db.openのコールバックにconsole.logを追加してみてください。

この行が'before findOne'より前に表示されない場合は、DB接続が開いていない可能性があります。

+0

はい、これは問題でした。私は_mongo-node blog tutorial_でそのアプローチを見つけましたが、誰も問題について報告していません。それは奇妙です... – koss

関連する問題