我正在尝试创建一个预处理程序,在将所有数据写入MongoDB之前对其进行清理 见:http://mongoosejs.com/docs/middleware.html
我尝试了以下方法让每个房产都能清理它:
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();
})
上述任何一种方法都会导致以下情况:
输出:
for(var key in obj) {
console.log(obj[key])
}
https://gist.github.com/daslicht/cb855f53d86062570a96
任何人都知道如何获得每一个属性以便我可以消毒吗?
〜马克
[编辑] 这是一个可能的解决方法,无论如何,将它直接放在Scheme级别会更干净,因为这样会更干燥
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 :(得分:3)
您可以使用mongoose-sanitizer插件,该插件使用Google Caja执行清理。
答案 1 :(得分: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 :(得分:0)
这是一种简单的方法。这使用async.js,但您可以重构它以使用通用JS循环或任何其他控制流库。关键是获取文档字段的数组,然后您可以使用this
使用当前上下文迭代这些字段并获取/设置值。据我所知,这将 不 将非字符串值强制转换为字符串。我用字符串,数字,布尔值和objectIds对它进行了测试,并将它们成功保存为原始数据类型。
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();
});
});
答案 3 :(得分: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();
})
即使你可以成功设置它,请注意Model.update 不会触发预保存挂钩。查看This GitHub issue