2013-08-19 30 views
9

tôi đang cố gắng để tạo ra một handler trước đó sanitizes tất cả các dữ liệu trước khi nó ghi vào MongoDB xem: http://mongoosejs.com/docs/middleware.htmldữ liệu Vệ sinh trước khi lưu để Mongoose

Tôi đã thử những điều sau đây để có được mỗi tài sản để có thể khử trùng nó :

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

Bất kỳ phương pháp trên kết quả vào một cái gì đó như sau:

Thats đầu ra của:

for(var key in obj) { 
     console.log(obj[key]) 
    } 

https://gist.github.com/daslicht/cb855f53d86062570a96

Bất kỳ biết làm thế nào để có được mỗi tài sản duy nhất để tôi có thể khử trùng nó, xin vui lòng?

~ Marc

[EDIT] Dưới đây là một cách giải quyết có thể, dù sao nó sẽ sạch hơn để có nó trực tiếp vào trình độ Đề án vì đây sẽ là DRY hơn

 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

Nguồn của các đường nối đầu ra là thực tế 'this' là một Ví dụ của Mô hình. Vì vậy, tôi cần phải lấy dữ liệu thô bằng cách nào đó và vệ sinh nó và viết nó trở lại – daslicht

+1

Tôi thực sự đã làm điều này bằng cách sử dụng một middleware thể hiện. Thậm chí nhiều DRY. – fakewaffle

+0

Cảm ơn bạn đã trả lời, tôi thậm chí còn nghĩ về điều này, nhưng khi sử dụng một Middleware Express, chúng tôi phải thêm nó theo cách thủ công vào từng tuyến đường để được bảo vệ hoặc quảng cáo trung gian toàn cầu. Nó sẽ không được tốt đẹp nếu chúng ta có thể trực tiếp như Mongoose Plugin?Tôi tò mò, bạn có muốn chia sẻ cách tiếp cận Middleware của bạn không? – daslicht

Trả lời

0

Đây là một cách đơn giản để làm đi. Điều này sử dụng async.js, nhưng bạn có thể cấu trúc lại nó để sử dụng vòng lặp JS chung hoặc bất kỳ thư viện luồng điều khiển nào khác. Điều quan trọng là lấy một mảng các trường của tài liệu, sau đó bạn có thể lặp qua các trường đó và nhận/thiết lập các giá trị sử dụng ngữ cảnh hiện tại với this. Theo tôi biết, điều này sẽ không ép buộc các giá trị không phải chuỗi vào chuỗi. Tôi đã thử nghiệm nó với chuỗi, số, booleans và objectIds và chúng được lưu thành công như là các kiểu dữ liệu ban đầu của chúng.

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

Có lẽ không phải là cách tốt nhất để làm điều đó.

Mongoose có field validators

Các Validators mặc định thường là đủ để hoàn thành công việc, nhưng xác nhận tùy chỉnh dễ dàng để tạo như quy định trong tài liệu.

Một ví dụ về một validator tùy chỉnh từ các tài liệu

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

Nó có thể được lưu ý, rằng trình xác nhận tùy chỉnh đặc biệt này có thể được thay thế bằng trình xác nhận "enum" của Mongooses. – BenSower

+0

Vấn đề với cách tiếp cận này là các nhà kiểm chứng chỉ kiểm tra, không vệ sinh. – Wtower

0

Theo This Thread, tôi nghĩ bạn có thể làm

blogSchema.pre('save', function (next) { 
    var obj = this; 
    blogSchema.schema.eachPath(function(path) { 
     SanitizeAndThrowErrorIfNecessary(obj(path), next); 
    }); 
    //Validation and Sanitization passed 
    next(); 
}) 

Thậm chí nếu bạn có thể thiết lập này thành công, xin lưu ý rằng mẫu. cập nhật sẽ không kích hoạt trước khi lưu móc. Kiểm tra This GitHub issue

Các vấn đề liên quan