2015-05-23 19 views
5

Tôi đang cố gắng sử dụng phiên bản không ổn định mới của trình đơn> 4.0.0 để xác thực các truy vấn cập nhật.Trong phần mềm trung gian mongoose, làm cách nào để truy cập vào truy vấn cập nhật?

nói rằng tôi muốn cập nhật một giản đồ bằng cách sử dụng truy vấn sau đây

schema.update({_id:'blah'},{a:'blah'},function(err){ 
//do your thing 
}) 

nên cho phép nói rằng tôi có giản đồ sau,

var schema = new Schema({ 
a:{type:String} 
}); 

schema.pre('update',function(next){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

// how do i get {a:'blah'}???? 

next(); 
}); 

làm thế nào để tôi nhận được truy vấn cập nhật {thiết lập: {a: 'blah'}} trong phần mềm trung gian trước vì vậy tôi có thể thực hiện một số kiểm tra trước khi thực hiện cập nhật?

cách khác tôi biết rằng các truy vấn cập nhật có thể được truy cập trong bài middleware, trong

schema.post('update',function(){ 
var findQuery=this._conditions; // gives {_id:'blah'} 

var updateQuery=this._update; //gives {$set:{a:'blah'}} 

next(); 
}); 

nhưng thats quá muộn, tôi cần điều này trong các middleware trước để kiểm tra trước khi thực sự cập nhật db.

tôi đã thử xem xét đối tượng 'này' của phần mềm trung gian trước nhưng không thể tìm thấy đối tượng updateQuery ở bất kỳ đâu và this._update không được xác định trong phần mềm trung gian trước.

Có cách nào để thực hiện việc này không? cảm ơn

Trả lời

1

Trong trường hợp bạn vẫn đang tìm giải pháp hoạt động trên mảng, có vẻ như trong phiên bản mới hơn của mongoose (ít nhất 4.0.7+), this._update được xác định trong phần mềm trung gian trước.

0

Tôi tìm thấy một công việc xung quanh thông qua ví dụ cụ thể này, tuy nhiên nó không hoàn toàn giải quyết được vấn đề thực tế của tôi. những gì bạn có thể làm trong phiên bản mongoose ~ 4.0.0 là để cho phần mềm trung gian trước chỉ định đi qua xác thực mô hình khi cập nhật.

schema.pre('update',function(next){ 
    this.options.runValidators = true; // make sure any changes adhere to schema 
}) 

về cơ bản, sau đó bạn có thể xác định xác nhận bên trong schema

var schema = new Schema({ 
    a:{ 
     type:String, 
     validate:[...] //the validation you want to run 
    } 
}); 

bạn có thể chọn để bỏ qua xác nhận trên một bình thường tiết kiệm hoạt động bằng cách sử dụng việc kiểm tra this.isNew bên trong chức năng xác nhận.

mã này sẽ chạy xác thực: [...] trên bất kỳ $ set nào và $ unset vào một trong truy vấn cập nhật của bạn. Tuy nhiên,

tuy nhiên, nó không hoạt động trên các hoạt động mảng như $ push hoặc $ addToSet vì một số lý do. vì vậy nếu bạn cập nhật một mảng, nó sẽ không chạy mã xác nhận ở tất cả! do đó nó không giải quyết được vấn đề thực tế mà im phải đối mặt. nhưng nó có thể hoạt động với ví dụ được cung cấp cho bất kỳ ai gặp phải vấn đề cụ thể này

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