【问题标题】:Node Js and mongoose date schema is not working节点 Js 和猫鼬日期模式不起作用
【发布时间】:2025-11-28 20:35:01
【问题描述】:

我创建了一个猫鼬模式并添加了一些模式类型

    const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: [true, 'Please tell us your name']
    },
    email: {
        type: String,
        required: true,
        unique: true,
        lowercase: true,
        validate: [validator.isEmail, 'please provide a email']
    },
    photo: String,
    password: {
        type: String,
        required: [true, 'Please provide a password'],
        minlength: 8,
        select: false
    },
    passwordConfirm: {
        type: String,
        required: [true, 'Please Confirm your password'],
        validate: {
            // This only works on CREATE AND SAVE!!!    
            validator: function(el) {
                return el === this.password
            },
            message: 'Passwords are not same'
        }
    },
    passwordChangedAt: Date
});

然后我将数据分配给模型

{
    "name" : "Abdullah",
    "email" : "abdullah@gmail.com",
    "password" : "pass1234",
    "passwordConfirm" : "pass1234",
    "passwordChangedAt" : "12-4-2021"
}

最后,“passwordChangedAt”属性没有显示在我的数据库中

【问题讨论】:

  • 可能是日期格式,试试 ("12-04-2021" ------ "dd-mm-yyyy")
  • 我已经尝试过这种格式
  • "passwordChangedAt" : new Date("4/12/2021");您需要使用特定格式在 mongo 中保存日期。

标签: node.js mongodb express mongoose mongoose-schema


【解决方案1】:

"12-4-2021" 的值是字符串,而不是日期。

请参阅 MongoDB 文档中对 Date 的描述。

Mongoose 将尝试将提供的值转换为 Date 类型。 请参阅 Mongoose 文档中的 Working with Dates 教程。

请注意,该教程中的每个字符串日期示例都使用“YYYY-MM-DD”格式。

【讨论】:

    【解决方案2】:

    在创建新用户时,需要获取请求的字段;即name: req.body.name; 同样,您需要获取passwordChangedAt: req.body.passwordChangedAt 的请求字段。

    【讨论】:

    • 是的,你是对的。它工作正常。
    【解决方案3】:

    如图所示。

    问题的真正原因是,passwordChangedAt 未包含在用户创建中。

    在exports.signup 中的authController 文件中添加下面标记的代码(文件未在您的代码中显示)

    const newUser = await User.create({
        name:req.body.name,
        email:req.body.email,
        password:req.body.password,
        passwordConfirm:req.body.passwordConfirm,
        passwordChangedAt: req.body.passwordChangedAt //add this line
        });
    

    其他代码继续.....

    强文本 [1]:https://i.stack.imgur.com/dp5JP.png

    【讨论】:

    【解决方案4】:

    确保passwordChangedAt 字段包含在相关处理程序中以接受从正文解析的数据。

    【讨论】:

      【解决方案5】:

      尝试在架构中将“passwordChangedAt”的类型设置为字符串而不是日期。
      如上所述,Mongo 可以对日期和字符串相关性“挑剔”。

      【讨论】:

        【解决方案6】:

        首先检查“passwordChangedAt”的类型

        userSchema.path('passwordChangedAt') instanceof mongoose.Date; // true
        

        另外,Mongoose 模式支持时间戳选项。如果您设置时间戳:true,Mongoose 将向您的架构添加两个 Date 类型的属性:

        1. createdAt: a date representing when this document was created
        2. updatedAt: a date representing when this document was last updated
        

        Mongoose 将在第一次插入文档时设置 createdAt,并在您使用 save()、updateOne()、updateMany()、findOneAndUpdate()、update()、replaceOne() 或 bulkWrite 更新文档时更新 updatedAt ()。

        有关详细信息,请参阅文档: https://mongoosejs.com/docs/timestamps.html

        【讨论】: