You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 08:55:14