Node.js 在保存到Mongoose之前清理数据

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

我试图创建一个预处理程序,在将数据写入MongoDB之前对所有数据进行清理 见:

我尝试了以下方法,以使每个属性都能够对其进行消毒:

  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中间件端口就好了,我还没有找到。。