[Bug] Control Bridge inside subgraph causes workflow crash

使用 ComfyUI 搭配 Impact Pack 插件,在子图(subgraph)内插入 Control Bridge 、 ImpactConditionalBranch 、 ImpactCompare 或 ImpactSelectNthItemOfAnyList 节点,当子图输入连接到节点的 v

[Bug] Control Bridge inside subgraph causes workflow crash

[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 BridgeImpactConditionalBranchImpactCompareImpactSelectNthItemOfAnyList 节点,当子图输入连接到节点的 value 或对应类型槽位后,保存工作流并再次打开时,工作流无法加载,直接报错崩溃。

报错原文

can't access property "output", node is undefined

(报错指向 Impact Pack 的 JavaScript 文件 impact-pack.js 中对应节点类型初始化代码行,如 Line 283 for ImpactControlBridgeLine 309 for ImpactConditionalBranch 等)

原因分析

根本原因是 Impact Pack 的 JS 扩展在子图场景下尝试通过 app.graph.getNodeById(link_info.origin_id) 获取上游节点对象,但由于子图的特殊输入机制,该节点对象可能尚未存在或为 undefined。代码随后直接访问 node.outputs[...] 属性,当 nodeundefined 时,触发 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。
  • 触发操作:创建子图 → 插入上述任何节点 → 连接输入端 → 保存工作流 → 重新打开工作流。

解决步骤

  1. 定位 Impact Pack 的 JS 文件:找到 ComfyUI 安装目录下的 custom_nodes/ComfyUI-Impact-Pack/js/impact-pack.js
  2. 备份原文件:复制一份 impact-pack.js 作为备份,如添加 .bak 后缀。
  3. 应用补丁:打开 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 类型,可能引发少量类型验证警告,但不影响正常工作流加载。
  4. 重启 ComfyUI:保存修改后的 impact-pack.js,完全关闭并重启 ComfyUI。
  5. (可选)等待官方更新:检查 Impact Pack 是否有正式修复版本(本 Issue 于 2025-09-25 被标记为已解决,正式合入可能出现在更高版本中,如 v9.x)。

验证方法

1. 按照复现步骤:创建新工作流 → 插入 Control Bridge 节点 → 转为子图 → 连接子图输入到 value 槽 → 保存工作流 → 关闭并重新打开。
2. 若工作流能正常加载且不崩溃,表示问题已修复。
3. 如果仍然遇到类型验证警告(如 type validation warning),属于预期行为,不影响运行。若出现新的崩溃,请回滚备份,检查补丁是否应用正确。

参考来源

ltdrdata/ComfyUI-Impact-Pack #1076 — Issue 正文及第 3 条评论中提供的补丁详细内容。

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 7566

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注