2011-09-23 9 views
8

Ok, quindi ho un oggetto JS che viene inviato tramite AJAX al backend nodejs. Voglio inserire questo oggetto js direttamente nel mio db mangusta come le chiavi dell'oggetto già corrispondono perfettamente con lo schema db.Mangusta: Inserimento di oggetti JS direttamente in db

ho attualmente presente (non dinamica ed eccessivamente complessa):

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

, ma vuole tagliare verso il basso a qualcosa di simile (sexy e dinamico):

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 quindi ho un oggetto JS che viene pubblicato tramite AJAX per il nodejs backend. Voglio inserire questo js oggetto direttamente nel mio mangusta db le chiavi oggetto già abbinano perfettamente con lo schema del db . "* Sembra un vettore ** eccellente ** per qualche tipo di attacco di iniezione, simile a [SQL injection] (http://en.wikipedia.org/wiki/SQL_injection). È sempre meglio elaborare e convalidare i dati sul server prima di inviarli. Non ci si può fidare dei clienti. –

+2

Sì, lo so. Questo è un caso di prova. Questa non era la mia domanda. – wilsonpage

+0

Quindi è un pessimo test, come si dovrebbe SEMPRE validare i dati :) Attualmente sto lavorando in un contesto simile e testato validate.js per convalidare i dati –

risposta

9

Se usi un plugin come questo con mangusta (http://tomblobaum.tumblr.com/post/10551728245/filter-strict-schema-plugin-for-mongoose-js) puoi semplicemente mettere insieme un array nel tuo modulo, come newitem[item_title] e newitem[item_abv] - o item[title] e item[abv]

Si potrebbe anche solo passare l'intero req.body se gli elementi corrispondono a lì. Il plugin MongooseStrict eliminerà tutti i valori non impostati in modo esplicito nello schema, ma lascerà comunque il controllo dei tipi e la convalida fino a mangusta. Con i metodi di convalida corretti impostati nello schema, sarai al sicuro da qualsiasi attacco di iniezione.

MODIFICA: Supponendo di aver implementato il plug-in, dovresti essere in grado di utilizzare questo codice.

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

grazie al metodo che hai descritto funzionante senza richiedere il plugin. Dovrò sicuramente implementarlo in un secondo momento per garantire la sicurezza. Qual è il punto in schemi se possono essere sovrascritti in questo modo? Quali altri metodi di validazione dell'input suggeriresti? – wilsonpage

+0

Gli schemi fanno molto in mangusta, soprattutto salvano correttamente i tipi in mongodb, ma consentono anche di impostare convalida, valori predefiniti e altre cose ODM. Al momento il livello più alto di un documento mongoose viene essenzialmente trattato come il tipo "Misto" (che accetta tutto e fa roba solo quando la proprietà aggiornata corrisponde a una proprietà nello schema) - il plugin forza l'mangusta in * solo * accetta proprietà nello schema –

+0

Provenendo da uno sfondo mySQL, sto faticando a capire completamente la mangusta. I documenti non sono così chiari per me. Potresti raccomandare alcune risorse o esempi. Non sto cercando di fare qualcosa di avanzato. – wilsonpage

Problemi correlati