You need to enable JavaScript to run this app. TypeScript Mongoose Schema:_created字段默认当前时间设置方法
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript Mongoose Schema:_created字段默认当前时间设置方法

问题本质

你遇到的所有报错,核心原因是混淆了TS类属性的类型声明规则和**@Prop装饰器的运行时配置传参要求**:

  • TS类的属性声明语法是属性名: 类型,冒号后面的内容会被TS当成类型定义去解析。你之前直接把整个Mongoose字段配置对象写在冒号后面,会触发语法解析错误;同时配置里的Date、getTime等值引用,会被TS误当成类型节点处理,才会出现「将值用作类型」「引用私有名称」这类奇怪的报错
  • 所有Mongoose的字段规则(类型映射、默认值、索引配置等),都需要作为参数传入@Prop()装饰器,不能直接内嵌在类属性的声明语句里

正确实现代码
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose';
import mongoose, { Document } from 'mongoose';

@Schema({collection: 'collection.name'})
export class myCollection extends Document {
    @Prop()
    _id: mongoose.Schema.Types.ObjectId;

    @Prop()
    name: string;

    @Prop({
        type: Date,
        // 箭头函数包裹,保证每次新建文档时动态获取当前时间
        default: () => Date.now()
    })
    _created: Date
}

export const myCollectionSchema = SchemaFactory.createForClass(myCollection)

各错误写法的对应修正说明
  • 针对写法一的报错:不能把_created : { type: Date, default: new Date() }直接写在类属性的位置,要把整个配置对象挪到@Prop()的括号内部
  • 针对写法二的报错:不要直接把default: Date.now作为配置值,用箭头函数包裹执行逻辑,避免TS在解析类导出成员时,把上下文的全局Date引用判定为越界访问
  • 针对写法三的报错:不需要在类外部单独定义时间获取函数,直接把取值逻辑写在装饰器的default配置里即可,彻底避开外部非导出变量的类型引用歧义

额外注意事项

  • 如果直接写default: new Date(),会在Schema模块被加载的瞬间就执行一次生成固定时间值,不会在每条新文档创建时动态获取当前时间,一定要用函数形式的默认值
  • 注意SchemaFactory的方法名是createForClass(Class首字母大写),之前的小写写法会触发方法不存在的运行时报错

内容的提问来源于stack exchange,提问作者Cris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.05 02:06:04