2013-08-19 5 views
9

Я пытаюсь создать предварительный обработчик, который дезинфицирует все данные, прежде чем его написал MongoDB см: http://mongoosejs.com/docs/middleware.htmlсанобработке данные перед сохранением Mongoose

Я попытался следующие действия, чтобы получить каждое свойство, чтобы иметь возможность дезинфицировать его :

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

Любой из вышеуказанных подходов приводит к чему-то вроде следующего:

Thats выход:

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

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

Любой знает, как получить каждое отдельное свойство, так что я могу дезинфицировать его, пожалуйста?

~ Марк

[EDIT] Вот один из возможных обходной путь, в любом случае, было бы чище, чтобы иметь его непосредственно на уровне схемы, так как это было бы более 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

Источником выходных швов является тот факт, что «это» является экземпляром модели. Поэтому мне нужно как-то получить необработанные данные и сделать снимок и записать их обратно – daslicht

+1

Я действительно сделал это с помощью простого промежуточного программного обеспечения. Еще более СУХОЙ. – fakewaffle

+0

Благодарим вас за ответ, я даже подумал об этом, но при использовании промежуточного программного обеспечения Express мы либо должны добавить его вручную, чтобы каждый защищаемый маршрут, либо глобальное промежуточное ПО. Было бы неплохо, если бы мы могли это сделать как плагин Mongoose?Мне любопытно, вам нравится делиться своим промежуточным подходом, пожалуйста? – daslicht

ответ

0

Вот простой способ сделай это. Это использует async.js, но вы можете реорганизовать его для использования общего цикла JS или любой другой библиотеки потока управления. Ключ состоит в том, чтобы получить массив полей документа, затем вы можете перебирать их и получать/устанавливать значения с использованием текущего контекста с помощью this. Насколько мне известно, это будет не принуждение не строковых значений в строки. Я тестировал его со строками, числами, булевыми объектами и объектами, и они успешно сохранялись в качестве исходных типов данных.

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

Возможно, это не лучший способ сделать это.

Mongoose имеет field validators

по умолчанию валидаторы В достаточно обычно, чтобы получить работу, но пользовательские валидаторы легко создать, как указано в документации.

Пример пользовательского валидатора из документации

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

Можно отметить, что этот специальный пользовательский валидатор может быть заменен валидатором Mongooses «enum». – BenSower

+0

Проблема с этим подходом заключается в том, что валидаторы проверяют, а не дезинфицируют. – Wtower

0

По This Thread, я думаю, что вы можете сделать

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

Даже если вы можете установить это успешно, обратите внимание, что модель. обновление не будет триггер pre save крюк. Check This GitHub issue

3

Вы можете использовать плагин mongoose-sanitizer, который использует Google Caja для выполнения санитарной обработки.

Смежные вопросы