升级mongoose@6.0.3后接口出现循环依赖报错如何解决
Mongoose 6.x 自引用Schema TypeScript 循环报错解决方法
该报错是Mongoose 6.x版本重构了LeanDocument类型实现后,新增了递归类型严格校验导致的,v5版本的类型定义没有对应校验逻辑,所以不会触发报错。
方案1:使用Mongoose内置PopulatedDoc类型(推荐)
Mongoose 6.x专门提供了PopulatedDoc类型用于处理关联填充字段的类型声明,原生兼容自引用场景,修改后的接口定义如下:
import mongoose, { model, Schema, Model, Document, PopulatedDoc } from "mongoose"; import { IUser } from "./user"; import { IPost } from "./posts"; export interface IComment extends Document { post: IPost; // 自引用字段改用PopulatedDoc包裹 replyTo: PopulatedDoc<IComment>; owner: IUser; content: string; // 数组类型同理 replies: PopulatedDoc<IComment>[]; createdAt: Date; updatedAt: Date; upvotes: number; downvotes: number; }
对应的Schema字段定义保持正常关联引用写法即可:
const CommentSchema = new Schema<IComment>({ replyTo: { type: Schema.Types.ObjectId, ref: "Comment" }, replies: [{ type: Schema.Types.ObjectId, ref: "Comment" }], // 其余字段定义省略 })
方案2:显式声明关联字段联合类型
如果不需要使用Mongoose内置的填充类型推导,也可以直接给自引用字段加上ObjectId联合类型,绕开循环校验:
import { ObjectId } from "mongodb"; export interface IComment extends Document { post: IPost; replyTo: IComment | ObjectId; owner: IUser; content: string; replies: (IComment | ObjectId)[]; // 其余字段省略 }
两种方案都兼容MongoDB Atlas无服务器实例的连接要求,无需回退Mongoose版本
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

