Es porque el objeto del documento que recibe de Mongoose no accede a las propiedades directamente. Utiliza la cadena prototipo, por lo tanto, hasOwnProperty
devolviendo falso (lo estoy simplificando mucho).
Puede hacer una de dos cosas:usar toObject()
para convertirlo en un objeto simple y luego sus cheques funcionarán como están:
var userPOJO = User.toObject();
if ( !(userPOJO.hasOwnProperty('local') && userPOJO.local.hasOwnProperty('password')) ) {...}
O simplemente puede verificar los valores directamente:
if ( !(User.local && User.local.password) ) {...}
Dado que ninguna de las propiedades puede tener un valor falso, debería funcionar para probar si están pobladas.
EDITAR:Otro control que olvidé mencionar es usar el get
incorporado de Mongoose método:
if (!User.get('local.password')) {...}