2013-08-19 80 views
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); 
+0

输出的来源是“this”是模型的实例。所以我需要以某种方式获取原始数据并将其理解并将其写回 – daslicht

+1

我实际上是使用快速中间件完成的。甚至更干。 – fakewaffle

+0

感谢您的回答,我甚至想到了这一点,但是在使用Express Middleware时,我们必须手动将其添加到每条受保护路径或全球中间件。如果我们可以直接使用Mongoose Plugin,那会不会很好?我很好奇,你想分享一下你的中间件方法吗? – daslicht

回答

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(); 
    }); 
}); 
2

可能不是最好的办法。

猫鼬有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

可以注意到,这个特殊的自定义验证器可以被Mongooses的“枚举”验证器替换。 – BenSower

+0

这种方法的问题是验证者只测试,而不是消毒。 – Wtower

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(); 
}) 

即使你可以设置此建立成功,请注意模型。更新不会触发预存钩子。检查This GitHub issue