在保存到Mongoose之前清理数据

时间:2013-08-19 16:35:58

标签: node.js express mongoose

我正在尝试创建一个预处理程序,在将所有数据写入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);

4 个答案:

答案 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