Jag vet att detta är en gammal fråga, men det accepterade svaret förklarar inte skillnaden ordentligt. Det förklarar skillnaden i beteende, men inte hur det faktiskt fungerar.
I din mongoose
schema, din default
kan antingen vara ett värde av den angivna typen eller en funktion som returnerar ett värde av den angivna typen. Date.now
är en inbyggd Javascript-funktion som returnerar den aktuella unix-tidsstämpeln som ett nummer.
Om du skickar Date.now
som default
i din mongoose
schema, skickar du funktionen och mongoose
anropar den funktionen varje gång ett dokument behöver ett standardvärde för den egenskapen. Detta resulterar i den aktuella tiden, vid tidpunkten för dokumentet skapande , som lagras som värdet för den egenskapen.
Men om du skickar Date.now()
istället skickar du värdet som returneras av Date.now()
snarare än funktionen. Genom att göra detta kommer dina dokument att få aktuell tid, vid tidpunkten för schema skapande , som standardvärde för den egenskapen. Det betyder att dina dokument kommer att lagra tidpunkten för den senaste distributionen, vilket förmodligen inte är vad du vill ha.
Om Date.now
var en konstant "ersatt av Mongoose med nuvarande datum och tid när en ny post skapades", som föreslås av det accepterade svaret, då borde följande logiskt fungera:
validUntil: {
type: Date,
default: Date.now + 3*60*60*1000 // 3 hours from now
}
Men Date.now
är inte magiskt ersatt av mongoose
, det är en funktion och du kan inte lägga till ett nummer till en funktion. Du kan dock anropa en funktion i din egen funktion och lägga till ett nummer till resultatet, som visas nedan:
validUntil: {
type: Date,
default: () => Date.now() + 3*60*60*1000 // 3 hours from now
}
Eftersom det inte framgick av det godkända svaret att Date.now
är en funktion och inte en mongoose
konstant, jag ville förtydliga det. Skillnaden mellan Date.now()
och Date.now
är det Date.now()
anropar funktionen och returnerar resultatet, medan Date.now
returnerar själva funktionen.