2015-06-18 18 views
11

Bu kodu vardır: Uygulamanın kimlik doğrulama diğer tür destekler yanaÖzellik var olduğunda, mongoose modelinin hasOwnProperty öğesi neden yanlış döndürülüyor?

user.findOne({ 'email' : email }, function(err, User) 
      { 
       if (err) 
       { 
        return done(err); 
       } 
       if (!User) 
       { 
        return done(null, false, { error : "User not found"}); 
       } 
       if (!User.hasOwnProperty('local') || !User.local.hasOwnProperty('password')) 
       { 
        console.log("here: " + User.hasOwnProperty('local')); // displays here: false 
       } 
       if (!User.validPass(password)) 
       { 
        return done(null, false, { error : "Incorrect Password"}); 
       } 
       return done(null, User); 
      }); 

, ben istiyorum giriş sırasında Yani

local : { password : "USERS_PASSWORD" } 

benziyor yerel denilen nesneyi yuvalanmış olan bir kullanıcı modeli Kullanıcının bir şifre sağlayıp sağlamadığını kontrol et ama bu ilginç problemle karşılaştım. Testim nesne şöyle görünür:

{ _id: 5569ac206afebed8d2d9e11e, 
email: '[email protected]', 
phno: '1234567890', 
gender: 'female', 
dob: Wed May 20 2015 05:30:00 GMT+0530 (IST), 
name: 'Test Account', 
__v: 0, 
local: { password: '$2a$07$gytktl7BsmhM8mkuh6JVc3Bs/my7Jz9D0KBcDuKh01S' } } 

ama console.log("here: " + User.hasOwnProperty('local')); baskılar here: false

hata yaptım

?

+1

Kullanıcı ve kullanıcı nasıl tanımlanır? Onların aynı olduklarını mı düşünüyorsun? –

+0

Hayır, aynı değil Tek bir var var değişken = ('../ modeller/kullanıcı'); 'hangi mongoose model olduğunu Diğer bir kod, yukarıdaki kodu –

+0

yukarıdaki geri çağırma argüman olduğunu, bu bir biraz kafa karıştırıcı. Genellikle sadece kurucular için büyük harfle başlayan şeyleri kullanmalısınız. –

cevap

14

Çünkü mongoose'dan geri aldığınız belge nesnesi doğrudan özelliklerine erişmiyor. Bu, zincirini kullanır ve bu nedenle hasOwnProperty yanlış döndürülür (bunu büyük ölçüde basitleştiriyorum).

İki şeyden birini yapabilirsiniz:

var userPOJO = User.toObject(); 
if (!(userPOJO.hasOwnProperty('local') && userPOJO.local.hasOwnProperty('password'))) {...} 

VEYA sadece doğrudan değerleri için kontrol edebilirsiniz:

if (!(User.local && User.local.password)) {...} 
olduğu gibi düz bir nesneye ve ardından çekleri çalışacak dönüştürmek için toObject() kullanmak

Her iki özellik de bir falsi değere sahip olmadıklarından, bunların popülasyon yapılıp yapılmadığını test etmek için çalışmalıdır.

DÜZENLEME:

if (!User.get('local.password')) {...} 
+0

Çalıştı! Çok teşekkürler: D @JasonCust –

+0

İkinci yöntem işe yaramadı (tanımlı özellikler için bile yanlış döndü), ancak '.toObject()' i kullanarak '.hasOwnProperty (...)' yi kullandı. Teşekkürler ! –

+1

@FrostyZ Bu konuda biraz kafam karıştı. Bahsetmeyi unuttuğum bir başka kontrol de Mongoose'un ['get' yöntemi] 'nde (http://mongoosejs.com/docs/api.html#document_Document-get) yerleşik olarak kullanılması:' if (! User.get (' local.password) ')) {...} '. Belki bu senin için daha iyi olur mu? –

1

yalnızca verileri değil, diğer Gelincik sihirli gerekiyorsa gibi .save(), .remove() vb sonra en basit yolu: Ben söylemeyi unutmuşum başka onay Gelincik adlı get method inşa kullanmaktır JSONuser = JSON.parse(JSON.stringify(User)) - - ve sonra JSONuser serbestçe alma değiştirme veya addin kullanmak Ayrıca MongoDB Şeması döndü JSON ayırabilirisiniz

user.findOne({ 'email' : email }, function(err, User).lean() 
      { 
       if (err) 
       { 
        return done(err); 
       } 
       if (!User) 
       { 
        return done(null, false, { error : "User not found"}); 
       } 
       if (!User.hasOwnProperty('local') || !User.local.hasOwnProperty('password')) 
       { 
        console.log("here: " + User.hasOwnProperty('local')); // Should now be "here: true" 
       } 
       if (!User.validPass(password)) 
       { 
        return done(null, false, { error : "Incorrect Password"}); 
       } 
       return done(null, User); 
      }); 
0

: .lean() kullanmak olacaktır ng, özelliklerinden herhangi biri.