Node.js 在保存到Mongoose之前清理数据
我试图创建一个预处理程序,在将数据写入MongoDB之前对所有数据进行清理 见: 我尝试了以下方法,以使每个属性都能够对其进行消毒:Node.js 在保存到Mongoose之前清理数据,node.js,express,mongoose,Node.js,Express,Mongoose,我试图创建一个预处理程序,在将数据写入MongoDB之前对所有数据进行清理 见: 我尝试了以下方法,以使每个属性都能够对其进行消毒: blogSchema.pre('save', function (next) { var obj = this; console.log(obj)//-> https://gist.github.com/daslicht/70e0501acd6c345df8c2 // I've tried the fol
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])
}
有人知道如何得到每一个单独的财产,以便我可以消毒它,拜托
~Marc
[编辑]
这里有一个可能的解决方法,无论如何,直接在方案级别上使用它会更干净,因为这样会更干燥
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);
这里有一个简单的方法。这将使用,但您可以重构它以使用通用JS循环或任何其他控制流库。关键是获取文档字段的数组,然后您可以通过
this
迭代这些字段,并使用当前上下文获取/设置值。据我所知,这将而不是将非字符串值强制转换为字符串。我用字符串、数字、布尔值和objectid对其进行了测试,它们成功地保存为原始数据类型
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();
});
});
据我所知,我认为你能做到
blogSchema.pre('save', function (next) {
var obj = this;
blogSchema.schema.eachPath(function(path) {
SanitizeAndThrowErrorIfNecessary(obj(path), next);
});
//Validation and Sanitization passed
next();
})
即使您可以成功设置,请注意Model.update也不会触发预保存挂钩。选中您可以使用plugin,它使用Google Caja执行清理。输出的来源可能是“this”是模型的一个实例。因此,我需要以某种方式获取原始数据,并对其进行sanetize和写回。实际上,我是使用express中间件完成这项工作的。更枯燥。谢谢你的回答,我甚至想过这个问题,但是当使用Express中间件时,我们必须手动将其添加到每个要保护的路由或ad全局中间件。如果我们能像猫鼬插件那样直接使用,那不是很好吗?我很好奇,您想分享一下您的中间件方法吗?不幸的是,xss()函数也去掉了有用的东西:/find这很有用,因为express validator(实际上是节点验证器父模块)不推荐使用xss清理。但是如果有一个mongoose中间件端口就好了,我还没有找到。。