2016-03-27 17 views
1

ラウンド正しいデータを最初に戻りません。MongoDBはこれが私のコードです

// Modules 
var mongodb = require('mongodb'); 
var MongoClient = mongodb.MongoClient; 
var url = 'mongodb://localhost:27017/affinity'; 
window.$ = window.jQuery = require('jquery'); 
var user_data; 

$(document).ready(function() { 

    // Look through db for user 
    // Flters through the db to find the user and their password to authenticate them in. 
    userInfo = function (db, callback) { 
    var username = $('#username').val(); 
    var password = $('#password').val(); 
    var users = db.collection('users'); 

    // Searches through each user in the db to find one which meets conitions. 
    var cursor = users.find({ 
    "username": username 
    }, {"limit": 1}).each(function (err, doc) { 
    if (doc != null) { 
     if (doc.password === password) { 
      user_data = doc; 
      //window.location.replace(__dirname + '/assets/views/main.html'); 
     } else { 
      $("#error-hint").css(
       'visibility', 'visible' 
      ); 
     } 
     } else { 
     // Skip user if it isn't matching 
     } 
    }); 
    console.log(user_data); 
} 

// Connects to database. 
// Inserts all user data to the database. 
MongoClient.connect(url, function (err, db) { 
    if (err) { 
     console.log('Couldn\'t connect to the mongoDB server. \nERROR: ' + err); 
    } else { 
     var collection = db.collection('users'); 

     // When login button run authUser function 
     $('#auth-btn').click(function() { 
     userInfo(db, function() { 
      db.close(); 
     }); 
     }); 
    } 
}); 


}); 

問題は、私は正しい情報でユーザーをのauthするボタンをクリックすると、それは未定義 'の値を返すということですボタンを2回押すと何も変更せずに、データベースから正しいデータを返します。私はそれがユーザーを正しく認証するために初めての回覧を表示したい。何が間違っているの?助けてください。

+0

私の回答は役に立ちましたか?もしそうでなければ、それを受け入れてください。 – Pio

答えて

0

console.log(user_data);undefinedのデータを返しますか?

コールバックでコールしていないためです。最初にconsole.log(user_data);という名前のdbクエリが呼び出されたため、ユーザーが見つかりませんでした。それを2回目に呼び出すと、最初のデータベースクエリーが完了したので、user_dataがすでに設定されているので、それが印刷されます。もう一度ログインボタンを押すと、別のユーザーを参照してみてください。最初のユーザーのデータが印刷されます。

あなたの呼び出しは非同期であることに注意してください。したがって、クエリの結果を確認するには、に渡されたコールバック関数のconsole.log(user_data);を入れてください。

また、結果セットを1つの要素に限定する場合は、db.collection.find({...},{limit...}).each(...)の代わりにdb.collection.fidnOne({...})を使用します。

+0

私は別のファイルで使用できるように、データベースから取得した結果をどのようにエクスポートしますか? – RyanM

+0

'find'または' each'のコールバックに渡すものは、クエリによって返されたデータに対して呼び出されます。もっと複雑な例については、[この質問](http://stackoverflow.com/questions/15852043/mongoose-find)を参照してください。 また、他のファイルはこのコンテキストでアクセス可能である必要があるので、このファイルの一部を他のファイルまたは他のファイルに含める必要があります。 あなたがexpressを使用しているなら、あなたはすでに 'module.exports'と' require'を使ってこのための仕組みを持っています。 – Pio

+0

別のファイルから呼び出すときに、未定義の値が返されます。 – RyanM

関連する問題