2012-07-11 34 views

Trả lời

18

Mongoose cho phép bạn định cấu hình các trình cài đặt tùy chỉnh mà bạn thực hiện so sánh. trước ('lưu') tự nó sẽ không cung cấp cho bạn những gì bạn cần, nhưng cùng nhau:

schema.path('name').set(function (newVal) { 
    var originalVal = this.name; 
    if (someThing) { 
    this._customState = true; 
    } 
}); 
schema.pre('save', function (next) { 
    if (this._customState) { 
    ... 
    } 
    next(); 
}) 
+0

Chỉ cần những gì tôi cần. Cảm ơn. – smabbott

+1

Tôi có cần thực hiện điều này để truy cập vào giá trị trước đó trong ** trình xác thực ** không? Hoặc có cách đơn giản hơn trong trường hợp người xác nhận hợp lệ? – eagor

+0

@aaronheckmann xin lỗi vì đã phục hồi một chuỗi cũ, tôi đoán điều này sẽ không hoạt động, nếu chúng tôi có nhiều máy chủ nút phía sau bộ cân bằng tải. – Saurabh

12

Câu trả lời được chấp nhận hoạt động rất tốt. Một cú pháp thay thế cũng có thể được sử dụng, với inline setter với định nghĩa Schema:

var Person = new mongoose.Schema({ 
    name: { 
    type: String, 
    set: function(name) { 
     this._previousName = this.name; 
     return name; 
    } 
}); 

Person.pre('save', function (next) { 
    var previousName = this._previousName; 
    if(someCondition) { 
    ... 
    } 
    next(); 
}); 
+0

nếu có lỗi xảy ra thì sao? – R01010010

1

Thành thực mà nói, tôi đã thử các giải pháp được đăng ở đây, nhưng tôi đã phải tạo ra một chức năng mà sẽ lưu trữ các giá trị cũ trong một mảng, lưu các giá trị, và sau đó thấy sự khác biệt.

// Stores all of the old values of the instance into oldValues 
const oldValues = {}; 
for (let key of Object.keys(input)) { 
    if (self[key] != undefined) { 
     oldValues[key] = self[key].toString(); 
    } 

    // Saves the input values to the instance 
    self[key] = input[key]; 
} 

yield self.save(); 


for (let key of Object.keys(newValues)) { 
    if (oldValues[key] != newValues[key]) { 
     // Do what you need to do 
    } 
} 
Các vấn đề liên quan