Jeg ved, at dette er et gammelt spørgsmål, men det accepterede svar forklarer ikke forskellen ordentligt. Det forklarer forskellen i adfærd, men ikke hvordan det rent faktisk fungerer.
I din mongoose
skema, din default
kan enten være en værdi af den angivne type eller en funktion, der returnerer en værdi af den angivne type. Date.now
er en indbygget Javascript-funktion, der returnerer det aktuelle unix-tidsstempel som et tal.
Hvis du sender Date.now
som default
i din mongoose
skema, sender du funktionen og mongoose
kalder den funktion hver gang et dokument har brug for en standardværdi for den pågældende egenskab. Dette resulterer i det aktuelle tidspunkt, på tidspunktet for dokumentet skabelse , bliver gemt som værdien for den pågældende ejendom.
Men hvis du sender Date.now()
i stedet sender du værdien returneret af Date.now()
frem for funktionen. Ved at gøre dette får dine dokumenter det aktuelle tidspunkt, på tidspunktet for skema skabelse , som standardværdien for den pågældende egenskab. Det betyder, at dine dokumenter gemmer tidspunktet for den seneste implementering, hvilket sandsynligvis ikke er det, du ønsker.
Hvis Date.now
var en konstant "erstattet af Mongoose med den aktuelle dato og klokkeslæt ved oprettelse af en ny post", som foreslået af det accepterede svar, så burde følgende logisk fungere:
validUntil: {
type: Date,
default: Date.now + 3*60*60*1000 // 3 hours from now
}
Men Date.now
er ikke på magisk vis erstattet af mongoose
, det er en funktion, og du kan ikke tilføje et tal til en funktion. Du kan dog kalde en funktion i din egen funktion og tilføje et tal til resultatet, som vist nedenfor:
validUntil: {
type: Date,
default: () => Date.now() + 3*60*60*1000 // 3 hours from now
}
Da det ikke fremgik tydeligt af det accepterede svar, at Date.now
er en funktion og ikke en mongoose
konstant, det ønskede jeg at præcisere. Forskellen mellem Date.now()
og Date.now
er det Date.now()
kalder funktionen og returnerer resultatet, mens Date.now
returnerer selve funktionen.