2012-07-04 28 views
10

Tôi muốn tạo ra một lớp mô hình với Mongoose cho tài liệu của tôi sử dụng, mà không:Mongoose ODM, thay đổi các biến trước khi lưu

  1. xác nhận (độc đáo, chiều dài)
  2. canonicalisation (username và email được chuyển đổi thành chữ thường để kiểm tra tính độc đáo)
  3. hệ muối
  4. mật khẩu băm
  5. (logging)

Tất cả các hành động này được yêu cầu phải được thực thi trước khi tồn tại cho db. May mắn thay mongoose hỗ trợ xác nhận, bổ sung và phần mềm trung gian.

Điều tồi tệ là tôi không thể tìm thấy bất kỳ tài liệu hay nào về chủ đề này. Các tài liệu chính thức trên mongoosejs.com quá ngắn ...

Có ai có ví dụ về các hành động trước với Mongoose (hoặc plugin hoàn chỉnh có tất cả, nếu nó tồn tại) không?

Trân

+0

tôi nghĩ tài liệu trên mongoosejs.com là khá rõ ràng trong lĩnh vực này. Bạn đã thử điều gì không hiệu quả? – JohnnyHK

+0

lĩnh vực xác nhận là rõ ràng nhưng không phải làm thế nào để chuẩn bị các đối tượng trước khi một số kiên trì. Tôi nghĩ rằng Schema.pre ('save', gọi lại); chức năng có thể là nó nhưng thiếu ví dụ đầy đủ cũng không biết cách truy cập các thuộc tính của đối tượng trong hàm pre –

+0

Bạn truy cập các thuộc tính của tài liệu qua 'this' trong hàm middleware của bạn. – JohnnyHK

Trả lời

24

Trong chức năng Schema.pre('save', callback) của bạn, this là tài liệu được lưu lại, và sửa đổi thực hiện cho nó trước khi gọi next() thay đổi nội dung đã lưu.

14

Một tùy chọn khác là sử dụng Getters. Dưới đây là một ví dụ từ trang web:

function toLower (v) { 
    return v.toLowerCase(); 
} 

var UserSchema = new Schema({ 
    email: { type: String, set: toLower } 
}); 

http://mongoosejs.com/docs/getters-setters.html

+0

Cần lưu ý rằng đây là tùy chọn duy nhất nếu giá trị bạn chuyển không phải là cùng một loại được xác định trong giản đồ cho thuộc tính được chỉ định . Ví dụ. Bạn có một thuộc tính 'amount' có kiểu' number' nhưng giá trị mà bạn truyền vào để xử lý là một 'chuỗi'. – Don

8
var db = require('mongoose'); 
var schema = new db.Schema({ 
    foo:  { type: String } 
}); 

schema.pre('save', function(next) { 
    this.foo = 'bar'; 

    next(); 
}); 

db.model('Thing', schema); 
+0

nó có thể được lưu ý, rằng trước cho 'lưu' không cháy khi cập nhật. sử dụng 'cập nhật' thay thế – sasha

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