Det beror på att dokumentobjektet du får tillbaka från mongoose inte kommer åt egenskaperna direkt. Den använder prototypkedjan och därför hasOwnProperty
returnerar falskt (jag förenklar detta avsevärt).
Du kan göra en av två saker:använd toObject()
för att konvertera det till ett vanligt objekt och sedan kommer dina checkar att fungera som de är:
var userPOJO = User.toObject();
if ( !(userPOJO.hasOwnProperty('local') && userPOJO.local.hasOwnProperty('password')) ) {...}
ELLER så kan du bara kolla efter värden direkt:
if ( !(User.local && User.local.password) ) {...}
Eftersom ingen av egenskaperna kan ha ett falskt värde bör det fungera för testning om de är ifyllda.
EDIT:En annan kontroll som jag glömde att nämna är att använda Mongooses inbyggda get
metod:
if (!User.get('local.password')) {...}