0

nodejs mnogdb-native ドライバーを介して mongodb からデータを取得しようとしています。mongodconsole は、接続が成功したことを示します。残念ながら、コレクションを取得し、メッセージ「before findOne」をコンソールに記録した後、何も起こりませんでした。findOneメソッドが返されないようです。

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;

考えられる問題点を教えてもらえますか?

4

2 に答える 2

2

本当に暗闇の中を突く - しかし、のコールバックに console.log を追加してみてくださいdb.open

その行が以前に表示されない場合'before findOne'、問題は単に DB 接続が開いていないことです。

于 2012-04-05T07:08:45.480 に答える
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 に送信され、コードが実行され続けるため、実際にはここで競合状態が発生します。

于 2012-04-05T09:18:42.583 に答える