Tôi biết đây là một câu hỏi cũ, nhưng câu trả lời được chấp nhận không giải thích sự khác biệt một cách chính xác. Nó giải thích sự khác biệt trong hành vi, nhưng không giải thích cách nó thực sự hoạt động.
Trong mongoose
của bạn lược đồ, default
của bạn có thể là một giá trị của kiểu được chỉ định hoặc một hàm trả về giá trị của kiểu được chỉ định. Date.now
là một hàm Javascript được tích hợp sẵn trả về dấu thời gian unix hiện tại dưới dạng một số.
Nếu bạn vượt qua Date.now
làm default
trong mongoose
của bạn schema, bạn đang chuyển hàm và mongoose
sẽ gọi hàm đó mỗi khi tài liệu cần giá trị mặc định cho thuộc tính đó. Điều này dẫn đến thời gian hiện tại, tại thời điểm tài liệu sự sáng tạo , được lưu trữ dưới dạng giá trị cho thuộc tính đó.
Tuy nhiên, nếu bạn vượt qua Date.now()
thay vào đó, bạn đang chuyển giá trị được trả về bởi Date.now()
chứ không phải là chức năng. Bằng cách làm này, tài liệu của bạn sẽ nhận được thời gian hiện tại, tại thời điểm của giản đồ sự sáng tạo , làm giá trị mặc định cho thuộc tính đó. Điều này có nghĩa là tài liệu của bạn sẽ lưu trữ thời gian triển khai mới nhất, điều này có thể không phải là điều bạn muốn.
Nếu Date.now
là một hằng số "được thay thế bởi Mongoose bằng ngày giờ hiện tại khi tạo bản ghi mới", như được đề xuất bởi câu trả lời được chấp nhận, thì điều sau sẽ hoạt động một cách hợp lý:
validUntil: {
type: Date,
default: Date.now + 3*60*60*1000 // 3 hours from now
}
Nhưng Date.now
không được thay thế một cách kỳ diệu bởi mongoose
, đó là một hàm và bạn không thể thêm một số vào một hàm. Tuy nhiên, bạn có thể gọi một hàm bên trong hàm của riêng mình và thêm một số vào kết quả, như được minh họa bên dưới:
validUntil: {
type: Date,
default: () => Date.now() + 3*60*60*1000 // 3 hours from now
}
Vì không rõ ràng từ câu trả lời được chấp nhận rằng Date.now
là một hàm chứ không phải mongoose
không đổi, tôi muốn làm rõ điều đó. Sự khác biệt giữa Date.now()
và Date.now
đó có phải là Date.now()
không gọi hàm và trả về kết quả, trong khi Date.now
trả về chính hàm.