![[Bug] Control Bridge inside subgraph causes workflow crash](https://www.chat-gpts.plus/wp-content/uploads/2026/06/1076-6d290573.jpg)
[Bug] Control Bridge inside subgraph causes workflow crash
快速结论:在子图(subgraph)内使用 Control Bridge(及 ImpactConditionalBranch、ImpactCompare、ImpactSelectNthItemOfAnyList 等动态类型节点)时,保存并重新打开工作流(workflow)后导致 ComfyUI 崩溃,报错 can't access property "output", node is undefined。优先排查 Impact Pack 插件版本是否为 v8.22.2 或更高,并应用社区提供的 JS 补丁。
问题场景
使用 ComfyUI 搭配 Impact Pack 插件,在子图(subgraph)内插入 Control Bridge、ImpactConditionalBranch、ImpactCompare 或 ImpactSelectNthItemOfAnyList 节点,当子图输入连接到节点的 value 或对应类型槽位后,保存工作流并再次打开时,工作流无法加载,直接报错崩溃。
报错原文
can't access property "output", node is undefined
(报错指向 Impact Pack 的 JavaScript 文件 impact-pack.js 中对应节点类型初始化代码行,如 Line 283 for ImpactControlBridge、Line 309 for ImpactConditionalBranch 等)
原因分析
根本原因是 Impact Pack 的 JS 扩展在子图场景下尝试通过 app.graph.getNodeById(link_info.origin_id) 获取上游节点对象,但由于子图的特殊输入机制,该节点对象可能尚未存在或为 undefined。代码随后直接访问 node.outputs[...] 属性,当 node 为 undefined 时,触发 can't access property "output", node is undefined 错误。
报告者发现,Impact Pack 的部分节点(如 ImpactInversedSwitch)已经做了类似 node?.outputs[link_info.origin_slot]?.type 的空值检查(见行 584-587),但 Control Bridge 等节点遗漏了覆盖。社区提供的补丁通过可选链(optional chaining)和 fallback 类型 '*' 来规避此问题。
环境排查
- ComfyUI 主程序版本:已确认在 最新 commit 上依然存在此问题。
- Impact Pack 版本:v8.22.2 及之前版本均受影响。
- 受影响节点:ImpactControlBridge、ImpactConditionalBranch、ImpactConditionalBranchSelMode、ImpactCompare、ImpactSelectNthItemOfAnyList。
- 触发操作:创建子图 → 插入上述任何节点 → 连接输入端 → 保存工作流 → 重新打开工作流。
解决步骤
- 定位 Impact Pack 的 JS 文件:找到 ComfyUI 安装目录下的
custom_nodes/ComfyUI-Impact-Pack/js/impact-pack.js。 - 备份原文件:复制一份
impact-pack.js作为备份,如添加.bak后缀。 - 应用补丁:打开
impact-pack.js,找到以下行并做相应替换(如果不熟悉手动 patching,可复制整个文件后用社区提供的补丁文本替换对应代码):
a. ImpactControlBridge(约 280-283 行):
slot_type = node.outputs[link_info.origin_slot]?.type;→slot_type = node?.outputs[link_info.origin_slot]?.type ?? '*';
b. ImpactConditionalBranch / ImpactConditionalBranchSelMode(约 306-309 行):
slot_type = node.outputs[link_info.origin_slot].type;→slot_type = node?.outputs[link_info.origin_slot].type ?? '*';
c. ImpactCompare(约 324-327 行):
let slot_type = node.outputs[link_info.origin_slot].type;→let slot_type = node?.outputs[link_info.origin_slot].type ?? '*';
d. ImpactSelectNthItemOfAnyList(约 348-351 行):
slot_type = node.outputs[link_info.origin_slot].type;→slot_type = node?.outputs[link_info.origin_slot].type ?? '*';
e. ImpactInversedSwitch(可选,约 405-408 行):
let origin_type = node.outputs[link_info.origin_slot]?.type;→let origin_type = node?.outputs[link_info.origin_slot]?.type;(已有 fallback 逻辑,仅保持一致性的非必需修改)
注意:社区补丁使用*作为 fallback 类型,可能引发少量类型验证警告,但不影响正常工作流加载。 - 重启 ComfyUI:保存修改后的
impact-pack.js,完全关闭并重启 ComfyUI。 - (可选)等待官方更新:检查 Impact Pack 是否有正式修复版本(本 Issue 于 2025-09-25 被标记为已解决,正式合入可能出现在更高版本中,如 v9.x)。
验证方法
1. 按照复现步骤:创建新工作流 → 插入 Control Bridge 节点 → 转为子图 → 连接子图输入到 value 槽 → 保存工作流 → 关闭并重新打开。
2. 若工作流能正常加载且不崩溃,表示问题已修复。
3. 如果仍然遇到类型验证警告(如 type validation warning),属于预期行为,不影响运行。若出现新的崩溃,请回滚备份,检查补丁是否应用正确。
参考来源
ltdrdata/ComfyUI-Impact-Pack #1076 — Issue 正文及第 3 条评论中提供的补丁详细内容。



