快速结论:当节点配置了 onError: continueErrorOutput 并执行失败时,handleNodeErrorOutput() 内部调用 dataProxy.$getPairedItem(...) 抛出异常且未被捕获,导致错误输出分支不触发,失败节点的输入项被当作成功结果从主输出泄露。优先排查失败节点上游 Switch 节点的 pairedItem 来源记录是否与实际输出索引一致。
适用环境:Issue 中确认的环境为 n8n 自托管部署;复现验证基于官方 n8n 2.39.8 镜像(n8n-core 2.39.6,Node v26.7.0)。报告者另一环境为自托管 2.36.7;代码引用以 n8n@2.36.9 为准。
最快修复方案:暂无确认的一步修复方案。Issue 中已确认的结构性缺陷是 handleNodeErrorOutput 只处理 $getPairedItem 返回 null 的情况,未捕获其抛出的 ExpressionError;该缺陷在 Issue 关闭时没有给出已验证的补丁或配置级修复。
注意事项:Issue 报告者无法构建最小复现,故障在其工作流中约每 8 次运行出现 1 次。复现检查只隔离出未捕获的查找异常,并未复现输入泄露和最终执行状态问题;错误来源记录为何不一致(intermittent)仍未查明。上游 Switch 节点 pairedItem 记录错误是否属于另一个独立缺陷,Issue 中也未确认。
问题场景
在 n8n 工作流中,某节点(报告者的场景为备份 AI agent)配置了 onError: continueErrorOutput,其输入来自 Switch 节点。该节点失败时,错误输出分支(output 1)本应被触发,但实际从未执行;失败节点的输入 item 反而出现在主输出 output 0 上,被下游节点当作正常成功结果处理。报告者提到,泄露的 item 恰好带有与 agent 回复字段同名的 output 字段,导致下游 IF 节点的“非空”判断通过,内部路由标签被原样发给终端用户。
报错原文
Error output never fires when $getPairedItem throws inside handleNodeErrorOutput — the failed node's input item leaks to the success output
ExpressionError: Paired item data for $getPairedItem from node 'Switch' is unavailable.
Ensure 'Switch' is providing the required output.
at createMissingPairedItemError (n8n-workflow/src/workflow-data-proxy.ts:869:11)
at Proxy.getPairedItem (n8n-workflow/src/workflow-data-proxy.ts:1015:12)
at WorkflowExecute.handleNodeErrorOutput (n8n-core/src/execution-engine/workflow-execute.ts:2752:41)
原因分析
最可能的原因是:handleNodeErrorOutput 在组装错误 item 时,只对 $getPairedItem 返回 null 的情况做了兜底(if (constPairedItem === null) { errorItems.push(item) }),但 workflow-data-proxy.ts 中的 getPairedItem 在缺少 paired item 数据时是直接 throw createMissingPairedItemError(...),而不是返回 null。异常因此逃逸出 handleNodeErrorOutput,造成三个连锁后果:
- 错误输出分支未被填充,下游错误处理不执行;
- 节点输入 item 被从主输出 output 0 发出,被当作节点结果;
- 节点级
runData记录executionStatus: "error",而整个执行仍为success,失败不会被外部监控发现。
触发查找失败的条件(报告者观察):失败节点的 item 带有 pairedItem: { item: 0 } 但缺少 input 键,于是 pairedItemInputIndex 回落为 0,使用了 executionData.source.main[0];而记录的来源条目实际指向 Switch 的输出 0,数据却是在 Switch 的输出索引 2 上发出的,输出 0 为空,查找即抛错。Issue 中未确认 previousNodeOutput 记录错误本身是否为第二个独立缺陷。
该问题与 #30050 不同:后者是使用错误输出时下游用户表达式 $('Node').item 失败;本例是 n8n 自身的错误路由代码抛异常,错误输出根本不会被填充。
环境排查
- 确认 n8n 版本;报告者提到 n8n@2.36.9 时代码未变,复现验证在 n8n 2.39.8(n8n-core 2.39.6)上完成。其他版本是否包含修复,Issue 中没有证据,不要假设。
- 确认 Node 版本;已验证环境为 Node v26.7.0,其他 Node 组合未验证。
- 确认部署方式(Docker 镜像或自托管安装)及 n8n-core 实际版本。
- 检查失败节点的错误输出是否确实接线,节点是否设置了
onError: continueErrorOutput。 - 检查失败节点上游是否为 Switch 等多输出节点,以及失败 item 的
pairedItem是否缺少input键(可在执行详情中查看)。 - 对比执行详情:节点
runData的executionStatus与执行整体状态是否不一致,错误分支是否为空。
解决步骤
- 先确认现象与报错栈一致:执行失败的节点设置了
continueErrorOutput,错误输出未触发,主输出 0 出现该节点的输入 item,且节点状态为 error、执行整体为 success。 - 检查执行详情中泄露 item 的
pairedItem与来源记录:若pairedItem缺少input且上游为多输出节点,记录的输出索引可能与实际发射索引不一致,这正是触发ExpressionError: Paired item data for $getPairedItem ... is unavailable的路径。 - 可优先尝试的临时规避:调整工作流结构,避免让配置了
continueErrorOutput的节点直接消费 Switch 的多输出分支,或在失败节点与其上游之间显式对齐/固定数据传递,降低 pairedItem 来源不一致的概率。此项为基于原因分析的规避思路,Issue 中没有经确认的修复验证。 - 如需验证本地是否受同一缺陷影响,可参考复现方法:调用已安装的
WorkflowExecute.handleNodeErrorOutput与真实 paired-item 查找,构造 item 位于 Switch 输出 2、来源记录为输出 0 的场景,预期出现上述ExpressionError且错误输出槽未被赋值。Issue 中提供的检查脚本需在无网络、只读挂载的容器中运行,退出码 1 属于预期的失败断言。 - 若需要根治,需在
handleNodeErrorOutput中捕获$getPairedItem的异常并走现有的errorItems.push(item)兜底路径;注意 Issue 中的方法级复现并未覆盖输入泄露和执行状态问题,且 Issue 关闭时没有提供已合并的修复版本,因此该改动属于推测性方向,落地前需自行验证。
验证方法
用与触发故障相同的输入重复运行工作流(报告者场景约为每 8 次出现 1 次,需多次运行):确认失败时错误输出分支被正常执行、主输出 output 0 不再出现失败节点的输入 item、下游节点不再把该 item 当作成功结果处理;同时确认节点级 error 状态能反映到可观测的执行结果上。若采用方法级检查,则构造不一致来源的用例,确认不再抛出 ExpressionError 且错误输出槽被填充,同时保持现有无来源/无 paired item 兜底用例仍通过。
参考来源
AI 工具推荐
想把多个 AI 模型放在一个入口?
GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。
推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。
这个方案解决了吗?
可以继续搜索完整报错,或查看同一工具的其他排查指南。
![[Bug][ROCm]: ROCM_ATTN sliding-window kernels output NaN when an out-of-window KV slot holds NaN/Inf](https://www.chat-gpts.plus/wp-content/uploads/2026/10/62828-de8b2c09-768x403.jpg)

