使用recursive array.push处理Google Shopping分类路径时堆内存溢出问题
问题根因
死循环的核心原因是你在while循环中只声明了nextRest变量,却没有将它赋值给循环判断用的rest变量,导致rest永远为初始拆分得到的非空值,循环永不终止,最终触发内存溢出。
优化解决方案
完全不需要逐次拆分路径,直接一次性拆分所有片段再做映射即可,代码更简洁且完全避免死循环风险:
export interface GPartialCategory { id: number; // 修正原类型定义:原写法是固定长度为1的元组,不符合变长数组需求 path: Array<{ counter: number; partialPath: string; }>; } @Injectable() export class CategoryService { constructor() { } async getAllGoogleCategories(): Promise<GPartialCategory[]> { const repo = getRepository(GCategoryEntity, 'default'); const allCategories = await repo.find({ order: { path: 'ASC' } }); return allCategories.map(category => this.parseCategoryPath(category)); } // 原方法名无实际含义(没有递归逻辑),重命名更清晰 private parseCategoryPath(category: GCategoryDto): GPartialCategory { // 一次性拆分所有路径片段 const pathFragments = category.path.split(' > '); // 直接映射为目标格式,用原生索引做counter不需要手动维护 const parsedPath = pathFragments.map((fragment, index) => ({ counter: index, partialPath: fragment })); return { id: category.id, path: parsedPath }; } }
如果你要保留原有逐次拆分的写法
只需要在while循环内新增一行rest = nextRest;即可修复死循环,但还是更推荐上面的实现,可维护性和性能都更优。
内容的提问来源于stack exchange,提问作者meDom
相关产品推荐
相关产品推荐

