2013-08-19 12 views
9

Sto cercando di creare un gestore pre che disinfetta tutti i dati prima della sua scritta al MongoDB vedere: http://mongoosejs.com/docs/middleware.htmldati Sanificazione prima di salvare a Mongoose

Ho provato quanto segue per ottenere ogni proprietà di essere in grado di disinfettare esso :

blogSchema.pre('save', function (next) { 
     var obj = this; 
     console.log(obj)//-> https://gist.github.com/daslicht/70e0501acd6c345df8c2 

     // I've tried the following to get the single items : 
     Object.keys(obj).forEach(function (key) { 
      console.log('Keys: ',obj[key]); 
     }); 

     //and: 
     for(var key in obj) { 
      console.log(obj[key]) 
     } 

     //and: 
     _.each(self , function(value, key, list){ 
      console.log('VALUE:',key); 
     }) 
     next(); 
    }) 

Qualsiasi degli approcci sopra i risultati in qualcosa di simile al seguente:

Questo è l'output di:

for(var key in obj) { 
     console.log(obj[key]) 
    } 

https://gist.github.com/daslicht/cb855f53d86062570a96

Qualsiasi sanno come ottenere ogni singola proprietà modo che io possa sterilizzare, per favore?

~ Marc

[EDIT] Ecco una possibile soluzione, comunque sarebbe più pulito di averlo direttamente sul livello di regime in quanto questo sarebbe più DRY

 var post = { 
      createdAt : req.body.date, 
      createdBy : req.user.username, 
      headline : req.body.headline, 
      content : req.body.content 
     } 

     _.each(post , function(value, key, list){ 
      post[key] = sanitize(value).xss(); //its the sanetize function of node validator 
     }) 

     var item = new Blog(post); 
+0

La fonte delle uscite sembra essere il fatto che "questa" è un'istanza del modello. Quindi ho bisogno di ottenere i dati grezzi in qualche modo e sanitarli e scriverli di nuovo – daslicht

+1

Realmente ho fatto questo usando un middleware espresso. Ancora più ASCIUTTO. – fakewaffle

+0

Grazie per la risposta, ho persino pensato a questo, ma quando si utilizza un middleware espresso, è necessario aggiungerlo manualmente a ogni percorso da proteggere o ad un middleware globale. Non sarebbe bello se potessimo dirlo come Mongoose Plugin?Sono curioso, ti piace condividere il tuo approccio Middleware, per favore? – daslicht

risposta

0

Ecco un modo semplice per fallo. Questo utilizza async.js, ma è possibile rifattorizzarlo per utilizzare un ciclo JS generico o qualsiasi altra libreria del flusso di controllo. La chiave è ottenere una matrice dei campi del documento, quindi è possibile scorrere su quelli e ottenere/impostare i valori utilizzando il contesto corrente con this. Per quanto ne so, questo sarà non forzare valori non stringa in stringhe. L'ho testato con stringhe, numeri, booleani e oggettiId e sono stati salvati correttamente come tipi di dati originali.

yourSchema.pre('save', function (next) { 
    var self = this; 

    // Get the document's fields 
    var fields = Object.keys(this._doc); 

    // Iteratively sanitize each field 
    async.each(fields, function(field, cb) { 
    self[field] = validator.escape(self[field]); 
    cb(); 
    }, function(err){ 
    next(); 
    }); 
}); 
2

Probabilmente non è il modo migliore per farlo.

Mongoose ha field validators

I validatori di default sono di solito sufficiente per ottenere il lavoro fatto, ma validatori personalizzati sono facili da creare, come specificato nella documentazione.

Un esempio di un validatore personalizzato dalla documentazione

var Toy = mongoose.model('Toy', toySchema); 

Toy.schema.path('color').validate(function (value) { 
    return /blue|green|white|red|orange|periwinkle/i.test(value); 
}, 'Invalid color'); 
+2

Si può notare che questo validatore personalizzato speciale può essere sostituito dal validatore "enum" di Mongooses. – BenSower

+0

Il problema con questo approccio è che i validatori testano, non disinfettano. – Wtower

0

Secondo This Thread, penso che si può fare

blogSchema.pre('save', function (next) { 
    var obj = this; 
    blogSchema.schema.eachPath(function(path) { 
     SanitizeAndThrowErrorIfNecessary(obj(path), next); 
    }); 
    //Validation and Sanitization passed 
    next(); 
}) 

Anche se è possibile impostare questa funzione con successo, si ricorda che modello. aggiornamento non innescare il gancio di pre-salvataggio. Verifica This GitHub issue

Problemi correlati