2016-03-27 7 views
1

yuvarlak doğru veri ilk kez döndürmez:MongoDB Bu benim kodudur

// 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(); 
     }); 
     }); 
    } 
}); 


}); 

Sorun doğru bilgi ile kullanıcıyı auth için düğmeye tıkladığınızda o 'tanımsız' değerini döndürür olmasıdır ancak herhangi bir şeyi değiştirmeden, düğmeye ikinci kez basarsam veri tabanından doğru verileri döndürürüm. Kullanıcının doğru şekilde kimliğini doğrulamak için ilk kez gösterilmesini istiyorum. Neyi yanlış yapıyorum? lütfen yardım et.

+0

Cevabınız yardım mı etti? Eğer öyleyse, lütfen güncellemeyi kabul ederseniz, lütfen kabul edin. – Pio

cevap

0

console.log(user_data);undefined veriyi mi veriyorsunuz?

Bunun nedeni, geri aramada çağırmamanızdır, bu nedenle ilk kez console.log(user_data); çağrılırsa db sorgusu, kullanıcıyı bulamadı. İlk veritabanı sorgusu bittiğinde ikinci kez aradığınızda, user_data zaten ayarlanmış, böylece size yazdıracaktır. Giriş düğmesine bastığınızda ikinci kez başka bir kullanıcı aramayı deneyin. İlk kullanıcının verilerini yazdıracaktır.

Aramalarınızın eşzamansız olduğunu unutmayın! Sorgulama sonucunu bitirdikten sonra console.log(user_data);'u geri arama işlevine each'a iletin.

Ayrıca sonuç kümenizi yalnızca bir öğe ile sınırlamak isterseniz, db.collection.find({...},{limit...}).each(...) yerine db.collection.fidnOne({...}) kullanın.

+0

Veritabanından aldığım sonuçları nasıl dışa aktarabilirim, böylece başka bir dosyada kullanabilirim. – RyanM

+0

"Bul" ya da "her" nin geri çağrılmasına ne kadar geçerseniz, sorgu tarafından döndürülen veriler çağrılır. Daha karmaşık bir örnek için [bu soru] bölümüne bakın (http://stackoverflow.com/questions/15852043/mongoose-find). Ayrıca, diğer dosyanızın bu bağlamda erişilebilir olması gerektiğini unutmayın, bu nedenle muhtemelen bu dosyanın bazı kısımlarını diğer dosyanıza veya diğer dosyaya eklemeniz gerekecektir. Ekspres kullanıyorsanız, bunun için 'module.exports' ve 'require' aracılığıyla bir mekanizma zaten var. – Pio

+0

Başka bir dosyadan çağrıldığında geri tanımlanmamış bir değer alıyorum. – RyanM