在NestJS中如何正确实现Mongoose递归子文档数组?
解决NestJS Mongoose递归子文档栈溢出问题
你遇到的栈溢出错误是因为直接在children属性中引用未完全定义的TreeViewBaseItem类,导致Mongoose在解析Schema时无限递归。以下是正确的实现方式:
步骤1:修改递归子文档的定义
在TreeViewBaseItem类中,将children的@Prop类型改为函数式返回,避免立即引用未完成定义的类,打破递归循环:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; import { TreeFile } from './tree-file.schema'; // 导入你的TreeFile子文档 @Schema() export class TreeViewBaseItem extends Document { @Prop({ type: String, required: true }) id: string; @Prop({ type: String, required: true }) label: string; // 核心修改:用函数返回类型,延迟解析 @Prop({ type: () => [TreeViewBaseItem], required: false, default: [] }) children?: TreeViewBaseItem[]; @Prop({ type: Boolean, required: false, default: false }) editable: boolean; @Prop({ type: [TreeFile], required: false, default: [] }) files: TreeFile[]; } export const TreeViewBaseItemSchema = SchemaFactory.createForClass(TreeViewBaseItem);
步骤2:在顶层Project文档中正常使用
修改后的TreeViewBaseItem可以直接在Project类中使用,不会再触发栈溢出:
import { Prop, Schema, SchemaFactory } from '@nestjs/mongoose'; import { Document } from 'mongoose'; import { TreeViewBaseItem } from './tree-view-base-item.schema'; @Schema() export class Project extends Document { // 你的其他Project属性... @Prop({ type: [TreeViewBaseItem], required: true, default: [] }) folderStructure: TreeViewBaseItem[]; } export const ProjectSchema = SchemaFactory.createForClass(Project);
原理说明
Mongoose在解析Schema时,若直接引用未完成定义的类会陷入无限递归解析。使用() => [TreeViewBaseItem]这种函数式写法,会延迟类型的解析时机——直到类完全定义后才执行函数获取类型,从而避免了循环递归导致的栈溢出。
内容的提问来源于stack exchange,提问作者MiguelG
相关产品推荐
相关产品推荐

