【问题标题】:What is the difference between Date.now() and Date.now in mongoose?猫鼬中的 Date.now() 和 Date.now 有什么区别?
【发布时间】:2025-12-15 21:55:01
【问题描述】:

我在猫鼬模型中使用Date.now()Date.now

我对它们之间的区别有点困惑。你能帮帮我吗?

【问题讨论】:

    标签: node.js mongodb


    【解决方案1】:

    我知道这是一个老问题,但接受的答案并没有正确解释差异。它解释了行为上的差异,但没有解释它实际上是如何工作的。

    在您的mongoose 架构中,您的default 可以是指定类型的值,也可以是返回指定类型值的函数。 Date.now 是一个内置的 Javascript 函数,它以数字形式返回当前的 unix 时间戳。

    如果您在mongoose 架构中将Date.now 作为default 传递,则您正在传递该函数,并且mongoose 将在每次文档需要该属性的默认值时调用该函数。这会导致当前时间,文档创建时,被存储为该属性的值。

    但是,如果您改为传递 Date.now(),则传递的是 Date.now() 返回的值,而不是函数。通过这样做,您的文档将获得当前时间,schema 创建时,作为该属性的默认值。这意味着您的文档将存储最新部署的时间,这可能不是您想要的。

    如果Date.now 是一个常量“在创建新记录时被 Mongoose 替换为当前日期时间”,正如接受的答案所建议的那样,那么以下应该在逻辑上起作用:

    validUntil: {
      type: Date,
      default: Date.now + 3*60*60*1000 // 3 hours from now
    }
    

    但是Date.now 并没有神奇地被mongoose 取代,它是一个函数,你不能在函数中添加数字。但是,您可以在自己的函数中调用函数并在结果中添加一个数字,如下所示:

    validUntil: {
      type: Date,
      default: () => Date.now() + 3*60*60*1000 // 3 hours from now
    }
    

    由于从接受的答案中不清楚 Date.now 是一个函数而不是 mongoose 常量,我想澄清一下。 Date.now()Date.now的区别在于Date.now()调用函数并返回结果,而Date.now返回函数本身。

    【讨论】:

    • 这个答案提供了重要的说明,即如果提供给猫鼬模式default 的值是一个函数,它将被调用。有了这些知识,您现在将能够了解默认架构选项的更高级用例。
    • 您好,感谢您的详细解答。您能否再澄清一下“通过这样做,您的文档将在创建模式时获取当前时间作为该属性的默认值。这意味着您的文档将存储最新部署的时间, “? “在创建模式时”和“最新部署”究竟是什么意思?
    【解决方案2】:

    Date.now 可以在 Mongoose 模式定义中用于为字段设置默认值,而 Date.now() 是 JavaScript 等价物。例如,在架构定义中设置默认值时,您使用Date.now。使用此架构定义,Mongoose 将使用当前时间填充 createdDate

    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    //schema
    var yourSchema= new Schema({
       text: {type: String},
       createdAt: {type: Date, default: Date.now}
    });
    

    但是,在针对您的架构编写 JavaScript 代码时,您必须使用 Date.now()

    yourSchema.pre('save', function doSomething(next){
       var something = this;
       something.createdAt(Date.now());
       next();
     });
    

    【讨论】:

    • 但是如果我使用 Date.now() 到我的架构定义来设置默认值,那么会发生什么?我的意思是我可以使用 Date.now() 来设置默认值吗??
    • Date.now 在创建新记录时被 Mongoose 替换为当前日期时间,因此每条记录都会更改。但是,如果您使用 Date.now(),您的默认值将设置为固定值(架构的创建时间)。
    • 非常感谢您的回答#Jaco