Това е така, защото обектът на документа, който получавате от mongoose, няма директен достъп до свойствата. Той използва веригата от прототипи, следователно hasOwnProperty
връща false (аз опростявам това значително).
Можете да направите едно от двете неща:да използвате toObject()
за да го преобразувате в обикновен обект и тогава вашите проверки ще работят както е:
var userPOJO = User.toObject();
if ( !(userPOJO.hasOwnProperty('local') && userPOJO.local.hasOwnProperty('password')) ) {...}
ИЛИ можете просто да проверите за стойности директно:
if ( !(User.local && User.local.password) ) {...}
Тъй като нито един от свойствата не може да има фалшива стойност, той трябва да работи за тестване, ако са попълнени.
РЕДАКТИРАНЕ:Друга проверка, която забравих да спомена, е да използвате вградения в Mongoose get
метод:
if (!User.get('local.password')) {...}