2011-08-13 11 views
0

mongodbから文字列値を取得して変数に格納する方法を私に教えてもらえませんか?MongoDBからのデータを変数mongooseとnode.jsに格納します

db.model("users").findOne({username: username, password: password}, {type:1}, 
    function(err, data) { 
     if(err) { 
      return "Error"; 
     } else if() { 
      return "No records"; 
     } else { 
      return data.type; 
     } 
    } 
); 

これを実行すると型の値が取得されます。

しかし、これをこの関数外の変数にどのように保存しますか?

答えて

2

匿名関数からの戻り値は完全に無視されます。現在のスコープからアクセス可能な任意の場所に変数を格納できます。例えば。 server.jsから

var Database = function { 
    var myText = null; 

    return {  

    getUser: function(username, password, callback) { 
     db.model("users").findOne({username: username, password: password}, {type:1}, 
      function(err, data) { 
      if (err) { 
       myText = "Error"; 
      } 
      else if (data.length == 0) { 
       myText = "No records"; 
      } 
      else { 
       myText = data.type 
      } 

      $('.log').html(myText); 
      callback(myText); 
     }); 
    }; 
    }; 
}(); 

は、あなたがして呼び出すことができます。

Database.getUser(username, password, function(theText) { alert(theText); }); 

あなたは同期的に実行されないコールバックとJavascriptのため、どのように相互作用するかの異なる要素について賢いする必要があります。それは、あなたが探している結果を達成することが可能なはずです。楽しんで、幸せなコーディング!

+0

問題は、Database.jsファイルのgetUserType関数を呼び出すServer.jsファイルがあることです。問題は、database.jsからserver.jsへの値を取得する方法を知らないことです。 – chris

+0

Server.jsから直接 'findOne'にコールバック関数を渡す必要があります。 MongoDBが同期していないので、あなたが示唆しているような方法で変数を渡すことは難しいです。 MongoDBはコールバックを扱うためのベストプラクティスに基づいています(つまり、呼び出される正確な場所でコールバックを 'findOne'に渡すため)、' findOne'をdatabase.jsにカプセル化しないことをお勧めします。つまり、コールバックをカプセル化し、database.jsでコールバックを渡すことで、常にコールバックをループすることができます。それは理にかなっていますか? – ghayes

+0

それはそうです:私はちょうどサーバにfindOne関数を置き、そのように実行します。私はちょうど私がサーバーとデータベースを分離すると思ったので、すべてが少し注文されたように見えます。 – chris

関連する問題