2011-09-23 14 views
8

Ok, więc mam obiekt JS, który jest POSTed przez AJAX do zaplecza nodejs. Chcę wstawić ten obiekt js bezpośrednio do mojej bazy danych Mongoose, ponieważ klucze obiektów są już doskonale dopasowane do schematu db.Mongoose: Wstawianie obiektu JS bezpośrednio do db

Obecnie mam to (nie dynamiczny i nadmiernie złożone):

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

Ale chcemy przyciąć go do czegoś takiego (sexy i dynamiczny):

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, więc mam obiekt JS, który jest Posted via AJAX do backend nodejs. Chcę wstawić ten js sprzeciw bezpośrednio do mojego mangusty db jako klucze obiekt już dopasować się idealnie ze schematu db "* Brzmi jak ** doskonały ** wektor do pewnego rodzaju ataku iniekcyjnego, podobnego do [SQL injection] (http://en.wikipedia.org/wiki/SQL_injection). Zawsze lepiej przetworzyć i zweryfikować swoje dane na serwerze przed wysłaniem. Klientom nie można ufać. –

+2

Tak, wiem. To jest przypadek testowy. To nie było moje pytanie. – wilsonpage

+0

Jest to zły przypadek testowy, ponieważ ZAWSZE należy sprawdzać poprawność danych :) Obecnie pracuję w podobnym kontekście i pomyślnie przetestowałem validate.js w celu sprawdzenia poprawności danych –

Odpowiedz

9

Jeśli używasz wtyczki takiej jak ta z mangustą (http://tomblobaum.tumblr.com/post/10551728245/filter-strict-schema-plugin-for-mongoose-js), możesz po prostu połączyć tablicę w swoim formularzu, np. newitem[item_title] i newitem[item_abv] - lub item[title] i item[abv]

Można także po prostu przekazać całość req.body, jeśli elementy pasują do siebie. Ta MongooseStrict plugin odfiltrowuje wszelkie wartości, które nie są jawnie ustawione w twoim schemacie, ale nadal pozostawia typy sprawdzania i walidację aż do mangusty. Dzięki odpowiednim metodom walidacji określonym w twoim schemacie będziesz bezpieczny przed atakami iniekcyjnymi.

EDYCJA: Zakładając, że zaimplementowałeś wtyczkę, powinieneś móc używać tego kodu.

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

dzięki opisanej metodzie działającej bez konieczności używania wtyczki. Zdecydowanie będę musiał go wdrożyć w dalszej kolejności, aby zapewnić bezpieczeństwo. Jaki jest sens schematów, jeśli można je tak przesłonić? Jakie inne metody sprawdzania danych wejściowych zaproponowałbyś? – wilsonpage

+0

Schematy robią dużo w mangusty, co najważniejsze, zapisują typy poprawnie w mongodb, ale pozwalają także skonfigurować sprawdzanie poprawności, ustawienia domyślne i inne elementy ODM. W tej chwili najwyższy poziom dokumentu mongoose traktowany jest zasadniczo jak typ "Mixed" (który akceptuje wszystko i robi tylko rzeczy, gdy właściwość update pasuje do właściwości w schemacie) - wtyczka wymusza mangusta na * tylko * akceptuje właściwości w schemacie –

+0

Pochodzę z tła mySQL i staram się w pełni zrozumieć mangustę. Dokumenty nie są dla mnie jasne. Czy możesz polecić jakieś zasoby lub przykłady? Nie zamierzam robić nic zaawansowanego. – wilsonpage

Powiązane problemy