2012-04-05 7 views
0

Ich versuche, Daten von mongodb durch NodeJS mnogdb-native Treiber abzurufen. mongod Konsole zeigt an, dass die Verbindung erfolgreich ist. Nach dem Abrufen der Sammlungs- und Protokollierungsnachricht "before findOne" an die Konsole ist leider nichts passiert. Es sieht so aus, als ob die Methode findOne niemals zurückkehrt.mongoe der FindOne Methode nether führt noch nicht

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; 

Kann mir jemand auf den wahrscheinlichen Problempunkt hinweisen?

Antwort

0

Werfen Sie einen Blick auf den Code, die Ihren Code verwenden würde:

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

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

Als ich ich zu myProvider.validateUser garantiert, bin, dass this.db.open() zurückgekehrt ist? Normalerweise ist das Ganze sequenziell. Aber in Node.JS, dass db.open() blockiert nicht. Der Anruf geht also an die DB und dann läuft der Code weiter, also hast du hier eine Race Condition.

+0

Ja, ich habe bereits festgestellt, dass, aber trotzdem danke. Ich war ein Neuling in der Event-getriebenen Welt, also habe ich keine offensichtlichen Dinge gesehen. – koss

2

Sack im Dunkeln wirklich - aber versuchen, für db.open eine console.log in den Callback hinzufügen.

Wenn das Line-Up nicht zeigt vor 'before findOne' dann am ehesten die Probleme einfach ist, dass die DB-Verbindung nicht geöffnet ist.

+0

Ja, das war ein Problem. Ich habe diesen Ansatz bei _mongo-node blog tutorial_ gefunden und niemand berichtet über Probleme. Das ist seltsam ... – koss

Verwandte Themen