vacio saber recorrer property objetos objeto has esta crear check array agregar node.js mongodb mongoose passport.js

node.js - saber - recorrer objeto javascript



¿Por qué el modelo de mangosta hasOwnProperty devuelve falso cuando la propiedad existe? (3)

Es porque el objeto de documento que obtiene de mangosta no accede directamente a las propiedades. Utiliza la cadena de prototipos , por lo que hasOwnProperty devuelve falso (estoy simplificando esto en gran medida).

Puede hacer una de toObject() dos cosas: use 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) ) {...}

Como ninguna de las propiedades puede tener un valor falso, debería funcionar para probar si están pobladas.

EDITAR: Otro cheque que olvidé mencionar es usar el método de get integrado de Mongoose:

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

Tengo este código:

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

Como la aplicación admite otros tipos de autenticación, tengo un modelo de usuario que tiene un objeto anidado llamado local que se parece a

local : { password : "USERS_PASSWORD" }

Por lo tanto, durante el inicio de sesión, quiero verificar si el usuario me ha proporcionado una contraseña, pero me encontré con este problema tan interesante. Mi objeto de prueba se ve así:

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

pero console.log("here: " + User.hasOwnProperty(''local'')); imprime here: false

¿Qué hice mal?


Si solo necesitas los datos y no la otra magia de Mangosta, como .save() , .remove() etc. la forma más simple sería usar .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); });


También puede separar el JSON devuelto de MongoDB Schema - JSONuser = JSON.parse(JSON.stringify(User)) - y luego usar JSONuser obteniendo, cambiando o agregando libremente cualquiera de sus propiedades.