9

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

任何人都知道如何获得每个单一的财产,以便我可以对其进行消毒,好吗?

~马克

[编辑] 这是一种可能的解决方法,无论如何直接在方案级别上使用它会更干净,因为这会更干燥

        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

3 回答 3

3

您可以使用mongoose-sanitizer插件,该插件使用 Google Caja 执行清理。

于 2016-03-23T11:25:23.657 回答
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();
  });
});
于 2014-06-30T16:32:13.733 回答
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不会触发预保存挂钩。检查这个 GitHub 问题

于 2016-01-31T07:29:59.050 回答