2012-12-24 34 views
6

Tôi có sơ đồ User có trường username. Tôi muốn trường này phân biệt chữ hoa chữ thường, để người dùng có thể đăng ký tên như BobDylan. Tuy nhiên, tôi cần lược đồ của tôi để xác thực các mục nhập mới để kiểm tra không có trùng lặp, trong trường hợp nhạy cảm, chẳng hạn như bobdylan. Nghiên cứu của tôi đã dạy tôi rằng tôi nên tạo một trường bổ sung trong lược đồ để lưu trữ phiên bản chữ hoa/chữ thường, để tôi có thể dễ dàng kiểm tra xem nó có phải là duy nhất hay không. Câu hỏi của tôi là, tôi sẽ đạt được điều này với Mongoose API như thế nào?Mongoose getter/setters để chuẩn hóa dữ liệu

Tôi đã cố gắng sử dụng một hàm set, chẳng hạn như:

UserSchema.path('username_lower_case').set(function(username_lower_case) { 
    return this.username.toLowerCase() 
}); 

Tuy nhiên, chức năng này dường như không được chạy. Về cơ bản, tôi cần phải thông báo cho username_lower_case là bất cứ điều gì username, nhưng trong trường hợp thấp hơn.

Trả lời

10

Một cách là sử dụng móc lưu trước để thực hiện.

UserSchema.pre('save', function (next) { 
    this.username_lower_case = this.username && this.username.toLowerCase(); 
    next(); 
}); 

Một cách khác sẽ được thực hiện username một ảo:

UserSchema.virtual('username').set(function (value) { 
    this.username_raw = value; 
    this.username_lower_case = value && value.toLowerCase(); 
}).get(function() { 
    return this.username_raw; 
}); 
+0

Cảm ơn! Việc lưu trước có xảy ra trước khi xác thực không? –

+1

Tôi không chắc chắn, nhưng tôi nghĩ khi bạn gọi 'save', các móc xác nhận sẽ chạy trước các móc' pre-save'. Ít nhất, điều đó sẽ có ý nghĩa nhất. –

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