Typegoose+Mongoose如何向数组中推送元组?
问题解决:Mongoose CastError 转换字符串失败
问题根源
你错误地将events字段的mongoose类型指定为String,但实际要存储的是元组数组([string, Date][])。当你尝试推入元组时,mongoose会按照配置的String类型去转换整个元组,自然抛出类型转换错误。
解决方案
修正@prop的类型配置,明确告诉mongoose这是一个包含String和Date的元组数组:
修改后的完整代码
import { prop, modelOptions, DocumentType, getModelForClass } from "@typegoose/typegoose"; import dbConnect from "src/lib/dbConnect"; import mongoose from 'mongoose'; @modelOptions({ schemaOptions: { timestamps: true } }) class Kitten { @prop() public name?: string; // 修正类型配置:指定为[String, Date]的数组 @prop({ type: [String, Date], required: true, default: [] }) public events!: [string, Date][]; // 也可保留 mongoose.Types.Array<[string, Date]> // 实例方法: public async addEvent(this: DocumentType<Kitten>, _eventName: string) { const tuple: [string, Date] = [_eventName, new Date()]; this.events.push(tuple); await dbConnect(); await this.save(); } } export const KittenModel = getModelForClass(Kitten);
关键说明
type: [String, Date]:明确告知mongoose,数组的每个元素是由字符串和日期组成的固定长度元组- TypeScript类型可以使用
[string, Date][]或mongoose.Types.Array<[string, Date]>,两者都能完成正确的类型推导 - 原代码中
type: String会强制mongoose将所有元素转为字符串,而你推入的元组是数组类型,因此触发转换失败
内容的提问来源于stack exchange,提问作者Eduardo Furtado
相关产品推荐
相关产品推荐

