2013-02-04 8 views
10

Trong kiểu máy của tôi, tôi có một số stats phụ thuộc vào thời gian. Ý tưởng của tôi là thêm middleware để thay đổi các thống kê này ngay sau khi mô hình đã được tải.Thay đổi giá trị mẫu sau khi tải trong Mongoose

Thật không may, tài liệu trên post -Có một chút thiếu rõ ràng. Có vẻ như tôi có thể sử dụng móc như thế này:

schema.post('init', function(doc) { 
    doc.foo = 'bar'; 
    return doc; 
}); 

Ví dụ duy nhất của họ liên quan đến console.log -kết quả. Nó không giải thích theo bất kỳ cách nào nếu doc phải được trả lại hoặc nếu một sự thay đổi trong Post-Hook là không thể (vì nó không phải là không đồng bộ, có thể có ít sử dụng cho các ý tưởng phức tạp).

Nếu pre trên 'init' không phải là cách phù hợp để tự động cập nhật mô hình khi tải, sau đó là gì?

Trả lời

16

Đây là cách chúng tôi cập nhật mô hình trên tải, làm việc không đồng bộ:

schema.pre('init', function(next, data) { 
    data.property = data.property || 'someDefault'; 
    next(); 
}); 

Pre-init là đặc biệt, các móc khác có một chữ ký hơi khác nhau, ví dụ trước tiết kiệm:

schema.pre('save', function(next) { 
    this.accessed_ts = Date.now(); 
    next(); 
}); 
+2

Vì vậy, pre-init thực sự là sau khi dữ liệu được nạp? Và tài liệu không nằm trong ngữ cảnh 'này'? – Lanbo

+3

Pre-init là sau khi dữ liệu được tải, nhưng * trước * tài liệu được ngậm nước với dữ liệu đó (afaik). Vì dữ liệu chưa được đặt trong tài liệu, ngữ cảnh "này" tồn tại (nó vẫn là tài liệu) nhưng nó sẽ trống (iirc). – hunterloftis

+0

Tôi muốn các tài liệu giải thích điều này. – binki