2011-09-23 11 views
8

Ok, así que tengo un objeto JS que se está enviando por medio de AJAX al backend del nodojs. Quiero insertar este objeto js directamente en mi db mongoose ya que las claves del objeto ya coinciden perfectamente con el esquema db.Mangosta: insertando objeto JS directamente en db

que actualmente tienen esta (no dinámico y excesivamente complejo):

app.post('/items/submit/new-item', function(req, res){ 
    var formContents = req.body.formContents, 
     itemModel = db.model('item'), 
     newitem = new itemModel(); 

    newitem.item_ID   = ""; 
    newitem.item_title  = formContents.item_title; 
    newitem.item_abv  = formContents.item_abv; 
    newitem.item_desc  = formContents.item_desc; 
    newitem.item_est  = formContents.item_est; 
    newitem.item_origin  = formContents.item_origin; 
    newitem.item_rating  = formContents.item_rating; 
    newitem.item_dateAdded = Date.now(); 

    newitem.save(function(err){ 
     if(err){ throw err; } 
     console.log('saved'); 
    }) 

    res.send('item saved'); 
}); 

Pero desea recortar hacia abajo a algo como esto (atractiva y dinámica):

app.post('/items/submit/new-item', function(req, res){ 
    var formContents = req.body.formContents, 

    formContents.save(function(err){ 
     if(err){ throw err; } 
     console.log('saved'); 
    }) 

    res.send('item saved'); 
}); 
+2

* "Ok, así que tiene un objeto JS que está siendo publicado a través de AJAX para el backend nodejs. Quiero insertar este js objeto directamente en mi db mangosta como las claves de objeto ya coinciden perfectamente con el esquema de db . "* Suena como un vector ** excelente ** para algún tipo de ataque de inyección, similar a [inyección SQL] (http://en.wikipedia.org/wiki/SQL_injection). Siempre es mejor procesar y validar sus datos en el servidor antes de enviarlos. Los clientes no pueden ser de confianza. –

+2

Sí, lo sé. Este es un caso de prueba. Esa no era mi pregunta. – wilsonpage

+0

Así que es un mal caso de prueba, ya que SIEMPRE debe validar datos :) Actualmente estoy trabajando en un contexto similar y probé con éxito validate.js para validar los datos –

Respuesta

9

Si utiliza un complemento como este con mangosta (http://tomblobaum.tumblr.com/post/10551728245/filter-strict-schema-plugin-for-mongoose-js), puede armar un conjunto en su formulario, como newitem[item_title] y newitem[item_abv] - o item[title] y item[abv]

También podría simplemente pasar la totalidad req.body si los elementos coinciden hasta allí. Ese plugin de MongooseStrict filtrará cualquier valor no establecido explícitamente en su esquema, pero aún deja los tipos de comprobación y la validación hasta mongoose. Con los métodos de validación adecuados establecidos en su esquema, estará a salvo de cualquier ataque de inyección.

EDIT: Suponiendo que ha implementado el complemento, debería poder utilizar este código.

app.post('/items/submit/new-item', function(req, res){ 
    new itemModel(req.body.formContents).save(function (e) { 
    res.send('item saved'); 
    }); 
}); 
+0

gracias al método que describió trabajado sin requerir el complemento. Definitivamente necesitaré implementarlo en una fecha posterior para garantizar la seguridad. ¿Cuál es el punto en los esquemas si pueden ser anulados así? ¿Qué otros métodos de validación de entrada sugerirías? – wilsonpage

+0

Los esquemas hacen mucho en mangostas, lo más importante es que guardan los tipos correctamente en mongodb, pero también le permiten configurar la validación, los valores predeterminados y otras cosas del ODM. Por el momento, el nivel superior de un documento de mangosta se trata esencialmente como el tipo "Mixto" (que acepta cualquier cosa y solo hace cosas cuando la propiedad actualizada coincide con una propiedad en el esquema) - el complemento obliga a la mangosta a * solo * aceptar propiedades en el esquema –

+0

Viniendo de un fondo mySQL, estoy luchando para comprender la mangosta por completo. Los documentos no son tan claros para mí. ¿Podría recomendar algunos recursos o ejemplos? No estoy buscando hacer algo avanzado. – wilsonpage