C'est parce que l'objet document que vous récupérez de mongoose n'accède pas directement aux propriétés. Il utilise la chaîne prototype d'où hasOwnProperty
renvoyant false (je simplifie grandement cela).
Vous pouvez faire l'une des deux choses :utiliser toObject()
pour le convertir en un objet simple et vos vérifications fonctionneront telles quelles :
var userPOJO = User.toObject();
if ( !(userPOJO.hasOwnProperty('local') && userPOJO.local.hasOwnProperty('password')) ) {...}
OU vous pouvez simplement vérifier les valeurs directement :
if ( !(User.local && User.local.password) ) {...}
Étant donné qu'aucune des propriétés ne peut avoir une valeur fausse, cela devrait fonctionner pour les tests si elles sont renseignées.
EDIT :une autre vérification que j'ai oublié de mentionner consiste à utiliser get
intégré à Mongoose méthode :
if (!User.get('local.password')) {...}