扣子工作流中断主因是数据流动中类型或结构异常。需查报错节点详情确认空值/类型错误,再向上追溯上游输出内容与类型,校验字段名、嵌套层级及变量引用路径,并对大模型json输出做清洗解析,循环节点须显式声明外部变量作用域。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

扣子可视化工作流跑着跑着突然中断,上一步显示绿色对勾、下一步却报红,控制台只显示“类型错误”或“变量未定义”——这不是节点坏了,是数据在节点间流动时悄悄变了模样。
确认错误源头不在报错节点本身
点击报错节点右侧的「详情」按钮,查看完整错误信息。如果提示类似 "Cannot read property 'xxx' of null" 或 "undefined is not an object",说明它收到的是空值或非预期结构的数据。
不要立刻改这个节点。往上点一个节点,打开它的「详情」→ 查看「输出」部分的实际内容。重点核对字段名是否拼写一致、嵌套层级是否被意外展平、值是否为 【null】 或空字符串。
这一步操作起来很简单,直接把文件拖进去就行。
检查上游节点输出类型与下游输入要求是否匹配
方法一:用节点配置面板验证
选中上游节点 → 点击右上角「设置」图标 → 展开「输出变量」区域。确认你引用的字段(如 user_info)明确标注了类型是 Object 还是 String。如果下游节点要求 Object,而这里显示 String,就必须加解析步骤。
方法二:在代码节点里加一行诊断输出
在报错节点前插入一个「代码节点」,输入:console.log("上游输出类型:", typeof input_data, "原始值:", input_data);
运行后看控制台打印结果。如果显示 string 但下游要数组,就证实是类型不匹配。
【大模型节点的 output 永远是 String,哪怕 Prompt 写了 JSON】 ——这是最常被忽略的前提,90% 的“取不到字段”问题都源于此。
修复变量引用路径错误
第一步:打开下游节点的输入配置
找到你填写变量的地方(比如大模型节点的「系统提示词」输入框),确认是否用了手动输入的变量名(如 user_intent)。
第二步:删除手输内容,点击输入框右侧的 {} 按钮
从弹出的变量选择器中,逐级展开上游节点 → 找到对应字段 → 点击插入。此时会自动生成类似 {{llm_1.output.user_intent}} 的引用路径。
第三步:检查路径中每个层级是否存在
比如 {{llm_1.output.data.items[0].title}},要确保 data 不是 null、items 是数组且长度 > 0、title 字段真实存在。任意一层断裂都会导致整个路径返回 undefined。
处理大模型输出的 JSON 字符串
在代码节点中粘贴以下标准解析模板:
try {<br> const raw = llm_output;<br> const cleaned = raw.replace(/```json\s*/gi, '').replace(/```\s*/g, '').trim();<br> const parsed = JSON.parse(cleaned);<br> return { data: parsed };<br>} catch (e) {<br> throw new Error(`JSON 解析失败: ${e.message},原始内容: ${raw.substring(0, 100)}`);<br>}
这段代码会自动剥离 Markdown 代码块包裹、去除首尾空格,并在解析失败时抛出带上下文的错误,方便你一眼看到原始乱码长什么样。
验证循环节点内部变量作用域
如果你在「循环」节点内引用了循环外定义的变量(比如开始节点传入的 base_url),必须手动勾选「循环内可用」选项。
进入循环节点设置 → 找到「变量传递」区域 → 将外部变量拖入「循环内可用变量」列表。否则循环体内部根本看不到这个变量,引用即为 undefined。
这一步漏掉会导致循环执行到第二次就崩,因为第一次靠缓存侥幸成功,第二次才暴露作用域问题。











