2012-03-16 11 views
2

組織目的で私はソースコードをモジュールに分割しています。たとえば、node.jsアプリケーションにuserというモジュールがあります。これはMongoDBデータベースからユーザー情報を取得するためのものです。Node.jsでのMongoDB操作時のコールバック

var mongo = require("mongodb"), 
    Server = mongo.Server, 
    Db = mongo.Db; 

var server = new Server("localhost", 27017, { auto_reconnect: true }); 
var db = new Db("users", server); 

module.exports = { 
    login: function(user, pass, callback) { 
     var reg_result = null; 

     db.open(function (err, db) { 
      if(!err) { 
       db.collection("users", function(err, collection) { 
        collection.findOne(
         { 
          "username": user, 
          "password": pass 
         }, 
         function(err, item) { 
          if(!err) { 
           reg_result = item; 
          } else { 
           reg_result = "error"; 
          } 
         } 
        ); 
       }); 
      } else { 
       reg_result = "error"; 
       console.log("ERROR: " + err); 
      } 
     }); 

     callback(reg_result); 
    } 
} 

そして、このように私のテストスクリプトにそれを実行する:私はこのような何かやっていることは、データベースの操作を行い、値が、それが唯一のnullを返すたびに取得

var user = require("./user.js"); 

user.log("test", "test", function(msg) { 
    console.log(msg); 
}); 

を、変数reg_resultを初期化しないと、undefinedが返されます。これを修正するにはどうしたらよいですか?

は私が出力されたuser.jsitemconsole.logを使用してデバッグが、私はそう、私は

答えて

5

あなたはコールバック関数を呼び出している私のテストスクリプトのように、他のソース上のアイテムを使用することができますコールバックを持ちたいですすぐにdbに行くには時間がかかるため、非同期で行われます。代わりに、.findOne()関数の最後のパラメータとして渡された関数のresult引数を使用して、適切な時刻にコールバックを呼び出します。

login: function(user, pass, callback) { 
    db.open(function (err, db) { 
     if(!err) { 
      db.collection("users", function(err, collection) { 
       collection.findOne(
        { 
         "username": user, 
         "password": pass 
        }, 
        function(err, item) { 
         if(!err) { 
          callback(null,item); 
         } else { 
          callback("error"); 
         } 
        } 
       ); 
      }); 
     } else { 
      callback("error",null); 
     } 
    }); 
} 


user.login("test", "test", function(err,msg) { 
    if(err) { 
     //error occured above; 
    } else { 
     //success 
     console.log(msg); 
    } 
}); 

これはただのMongoDBドライバが使用している同じパターンを通じ引っ張っている:コールバックはエラー引数と結果引数を取得する必要があります。 助けてくれることを願っています。

+0

非常にありがたく、完璧に動作します! Phonegapを使って純粋なjQueryモバイルアプリからnode.jsに移行していますので、ノード上で非同期に慣れるのは少し難しいです。 **:)** –

関連する問題