2012-03-08 15 views
5

Obtengo un resultado (el objeto) de una consulta de mangosta y deseo reemplazar/eliminar algunas claves, antes de codificar el objeto y enviarlo al cliente.cómo inspeccionar/iterar sobre un objeto en el nodo?

Cuando console.log el objeto, todo está bien (todas las teclas están en la lista, nada más). Cuando hago un for..in en el objeto, los campos ocultos aparecen de la nada (y las claves de interés, no). Tienen sentido, pertenecen a la mangosta, pero yo no los quiero. Lo mismo ocurre cuando se usan Object.keys u Object.getOwnPropertyNames en el objeto: campos ocultos, ninguno útil.

Así que quería inspeccionar el elemento con util.inspect (obj, true, null, true) y registrar el resultado en la consola. El resultado en la consola es el mismo, como si hubiera consolado.logged el objeto directamente sin la inspección.

Ahora, dos preguntas;

  1. ¿Cómo inspecciono correctamente un objeto, de modo que realmente obtengo información interna/oculta sobre el objeto?
  2. ¿Cómo puedo iterar sobre el objeto y solo obtener los campos? (Sí, estoy haciendo el cheque hasOwnProperty dentro del bucle for..in)

// EDITAR

OK, lo tengo. Después de algunas investigaciones, me di cuenta de que el objeto mangosta representa sus propiedades y tiene una función TOJSON, lo que explica por qué console.logs estaba en la estructura de salida esperada. La solución es usar el método de Mongoose toObject;

mongooseObj.toObject({ getters: true, virtuals: false }) 

De esta manera, puedo iterar sobre Object.getOwnPropertyNames y reemplazar/eliminar las claves no quiero que el cliente saber!

+0

¿Puedes volver a formular tu pregunta un poco? Me está costando entender lo que estás preguntando. ¿Qué quieres decir con "campos ocultos"? ¿Son solo propiedades las que están más arriba en la cadena de prototipos? ¿Las propiedades que están marcadas como no enumerables? ¿O propiedades que comienzan con _underscore? –

Respuesta

4

voy a suponer que usted está buscando en el documento objeto devuelto por una consulta mangosta cuando realmente sólo desea ver los datos. Si mi suposición es correcta, es probable que desee algo como esto:

Model.findOne({ name: 'john' }, function (err, doc) { 
    var data = doc.toObject(); 

    // do whatever you need to with data 
    delete data.age; 
    delete data.weight; 
    data.isAwesome = true; 

    // now stringify the data and do something with it 
    callback(JSON.stringify(data)); 
}); 
+1

hey abe, gracias por su respuesta. De hecho, ahora veo que tienes el toObject en tu respuesta ... debería haberlo visto desde el principio;) ¡Gracias por tu ayuda! – japrescott

0

Además, si desea acceder a un determinado campo de un documento se puede echar un vistazo a:

Document#get

// path 
doc.get('age') // 47 

// dynamic casting to a string 
doc.get('age', String) // "47" 
Cuestiones relacionadas