2012-02-23 12 views
8

Estoy utilizando Mongoose y quiero eliminar la propiedad _id de mi instancia de Mongoose antes de enviar la respuesta JSON al cliente.La clonación de objetos de mangosta y la eliminación de propiedades del subrayado no funciona?

Ejemplo:

var ui = _.clone(userInvite); 
delete ui["_id"]; 
console.log(JSON.stringify(ui)); //still has "_id" property, why? 

La anterior no funcionó.

Sin embargo, si lo hago:

var ui = JSON.parse(JSON.stringify(userInvite)); //poor man's clone 
delete ui["_id"]; 
console.log(JSON.stringify(ui)); //"_id" is gone! it works! 

No entiendo por qué llamar delete en un objeto clonado utilizando subrayado no funciona, pero si lo hago el JSON.string hacky/JSON.parse, funciona.

¿Alguna idea de este comportamiento?

+0

Mangosta Probablemente se arrastre y la implementación de '_id' como un captador/definidor en lugar de como una propiedad . Pruebe 'Object.getOwnPropertyDescriptor (userInvite," _id "). Get' – Raynos

+0

También es imposible modificar cualquier propiedad de clonar objeto de mangosta. – Hill

Respuesta

6

Acabo de encontrar un problema similar tratando de reemplazar _id con id. Hacer esto funcionó para mí:

Schema.methods.toJSON = function(options) { 
    var document = this.toObject(options); 
    document.id = document._id.toHexString(); 
    delete(document._id); 
    return document; 
}; 

Tal vez pueda empezar a trabajar si reemplaza delete ui["_id"] con delete ui._id o utilizar en lugar de toObject_.clone.

+0

Me encontré con esto tratando de eliminar la contraseña de mi objeto de usuario y me quedé perplejo durante un buen rato sobre por qué 'delete user.password' no funcionaba. El uso de toObject() parece haber hecho el truco. Mi suposición es que Mangosta no está almacenando los atributos como propiedades en el objeto y lo construye dinámicamente usando un método toString o algo similar. – Fapiko

0

Solo para agregar a la respuesta anterior, hay una forma más de lograr lo mismo. la función 'toObject' se aplica la transformación al documento que se define por la función schema.options.toObject.transform, por ejemplo

schema.options.toObject.transform = function(doc, ret) { 
    ret.id = doc._id; 
    delete ret._id; 
}; 
Cuestiones relacionadas