2015-06-18 8 views
11

ho questo codice:Perché hasOwnProperty del modello di mangusta restituisce false quando la proprietà esiste?

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

Dal momento che l'applicazione supporta altri tipi di autenticazione, ho un modello di utente che ha nidificato oggetto denominato locale che assomiglia

local : { password : "USERS_PASSWORD" } 

Così durante login voglio controlla se l'utente ha fornito una password ma ho riscontrato questo problema interessante. mio oggetto di prova si presenta così:

{ _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' } } 

ma console.log("here: " + User.hasOwnProperty('local')); stampe here: false

Dove ho sbagliato?

+1

Come sono definiti utente e utente? Stai assumendo che siano uguali? –

+0

No, non sono uguali Uno è 'var user = require ('../ models/user');' che è il modello di mangusta L'altro è l'argomento di callback nel codice sopra –

+0

ok, questo è un un po 'di confusione. Di solito dovresti usare solo le cose che iniziano con una lettera maiuscola per i costruttori. –

risposta

14

È perché l'oggetto documento che si ottiene da mangusta non accede direttamente alle proprietà. Utilizza la catena prototype quindi hasOwnProperty restituendo false (sto semplificando notevolmente).

Si può fare una delle due cose: usare toObject() per convertirlo in un oggetto semplice e quindi i vostri controlli funzioneranno come è:

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

O si può solo verificare la presenza di valori direttamente:

if (!(User.local && User.local.password)) {...} 

Poiché nessuna proprietà può avere un valore di falsy, dovrebbe funzionare per il test se sono popolate.

EDIT: Un altro controllo Ho dimenticato di dire è quello di utilizzare costruito in get method di Mongoose:

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

Ha funzionato !! Grazie mille: D @JasonCust –

+0

Il secondo metodo non ha funzionato (restituito falso anche per le proprietà definite), ma usando '.toObject()' allora '.hasOwnProperty (...)' era Ok. Grazie ! –

+1

@FrostyZ Sono un po 'confuso da quello. Un altro controllo che ho dimenticato di menzionare è l'uso del metodo ['get'] di Mongoose (http://mongoosejs.com/docs/api.html#document_Document-get):' if (! User.get ('local.password ')) {...} '. Forse sarebbe meglio per te? –

1

Se avete solo bisogno i dati e non il contrario magia Mongoose come .save(), .remove() ecc quindi il modo più semplice sarebbe quella di utilizzare .lean():

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

È inoltre possibile staccare il JSON tornato da MongoDB Schema - JSONuser = JSON.parse(JSON.stringify(User)) - e quindi utilizzare JSONuser liberamente entrare, cambiare o addi ng, ognuna delle sue proprietà.

Problemi correlati