Skip to content

内置节点

内置节点是工作流引擎的基础能力单元,每种节点类型封装了特定的逻辑操作。节点按功能分为四组:

分组group说明包含节点
基础节点model工作流入口与页面交互开始、物料事件、切换页面、流程注释
数据管理data变量操作与外部通信赋值变量、合并变量、云函数、HTTP请求
流程控制flow条件判断与循环条件分支、循环体、跳出循环、延迟
Ai工具aiAI 辅助能力(暂无节点)

节点元数据结构

Snippet(节点片段)

节点片段定义了节点在面板中的展示信息和拖拽生成节点时的默认数据。

ts
snippet: {
  name: '条件分支',              // 面板中显示的名称
  component: 'NodeCondition',    // 节点组件名
  icon: 'icon-panduanshifoucunzai', // 面板中显示的图标类名
  schema: {
    props: {                     // 拖拽生成节点时的默认属性
      conditions: []
    }
  }
}
字段类型说明
namestring面板中显示的名称
componentstring节点组件名
iconstring面板中显示的图标类名
schema.propsobject拖拽生成节点时的默认属性值

Component(节点配置)

节点配置定义了属性面板、端口连接和行为约束。

ts
component: {
  schema: {
    properties: [...]           // 属性分组列表
  },
  ports: [...],                 // 端口列表
  configure: {                  // 节点行为配置
    canConfig: true,
    isShow: true
  },
  note: '...'                   // 节点备注说明(可选)
}

schema.properties 属性分组

与物料元数据的 properties 结构一致,按分组折叠展示属性配置项:

ts
properties: [
  {
    label: '基本属性',           // 分组名称
    content: [                  // 分组下的属性项列表
      {
        label: '执行函数',
        description: '需要执行的云函数',
        property: 'code',
        widget: {
          component: 'BindVariable',
          props: { type: 'cloudFuns' }
        },
        labelPosition: 'left'
      }
    ]
  }
]

属性项字段说明:

字段类型说明
labelstring属性标签
descriptionstring属性描述
propertystring属性名
widgetobject属性编辑器配置(同物料 widget)
labelPosition'left' | 'top'标签位置

ports 端口列表

端口定义了节点之间的连接关系,是工作流数据流转的通道:

ts
ports: [
  {
    id: 'input',                // 端口标识
    type: 'target',             // 端口方向
    description: '输入端口,接收上一个节点的输出'
  },
  {
    id: 'if-{branchId}',        // 支持模板变量
    type: 'source',
    description: 'IF/ELIF分支端口',
    dynamic: true,              // 是否动态生成
    example: 'if-abc123, if-def456'  // 动态端口示例
  },
  {
    id: 'error',
    type: 'source',
    description: '异常端口',
    conditional: true,          // 是否条件端口
    condition: '当节点的error-branch属性设置为branch时可用'
  }
]

端口字段说明:

字段类型说明
idstring端口标识,支持模板变量(如 if-{branchId}event-{branchId}
type'target' | 'source'端口方向,target 为输入端口,source 为输出端口
descriptionstring端口说明
dynamicboolean是否动态生成端口(可选,默认 false
examplestring动态端口的 ID 示例(可选)
conditionalboolean是否为条件端口,满足特定配置时才可用(可选,默认 false
conditionstring条件端口的启用条件说明(可选)

端口方向说明:

  • target(输入端口):接收上游节点的输出,位于节点左侧
  • source(输出端口):向下游节点传递数据,位于节点右侧

动态端口:

条件分支和物料事件节点的端口数量不固定,使用模板变量动态生成:

  • 条件分支:if-{branchId} — 每个条件分支对应一个输出端口
  • 物料事件:event-{branchId} — 每个事件绑定对应一个输出端口

configure 节点行为配置

字段类型说明
canConfigboolean是否可配置,false 时无属性面板
isShowboolean是否在面板中显示,false 时不在面板中展示(如开始节点)(可选,默认 true

note 节点备注

note 为可选字段,提供节点的补充说明,如"跳出循环节点没有输出端口"。

节点分组注册

所有节点通过 @catpull/built-in-nodes/src/meta/index.ts 统一注册,按分组组织:

ts
export default {
  nodes: [
    {
      group: 'model',           // 分组标识
      label: '基础节点',         // 分组显示名称
      priority: 100,            // 排序优先级(数值越大越靠前)
      children: [NodeStart, NodeComponent, NodeSwitchPage, NodeNote]
    },
    {
      group: 'data',
      label: '数据管理',
      priority: 90,
      children: [VariableAssign, NodeMerging, NodeCode, NodeHttp]
    },
    {
      group: 'flow',
      label: '流程控制',
      priority: 80,
      children: [NodeCondition, NodeLoop, NodeBreakLoop, NodeDelay]
    },
    {
      group: 'ai',
      label: 'Ai工具',
      priority: 70,
      children: []
    }
  ]
}

完整示例

NodeCondition(条件分支)为例,展示完整的节点元数据定义:

ts
export default {
  snippet: {
    name: '条件分支',
    component: 'NodeCondition',
    icon: 'icon-panduanshifoucunzai',
    schema: {
      props: {
        conditions: []
      }
    }
  },
  component: {
    schema: {
      properties: [
        {
          label: '基本属性',
          content: [
            {
              label: '条件列表',
              property: 'conditions',
              widget: {
                component: 'Condition',
                children: [
                  {
                    label: '被比较值',
                    property: 'compared-value',
                    widget: { component: 'BindVariable', props: { type: 'state' } },
                    labelPosition: 'left'
                  },
                  {
                    label: '条件类型',
                    property: 'compare',
                    widget: {
                      component: 'Select',
                      props: {
                        options: [
                          { label: '等于', value: 'equal' },
                          { label: '不等于', value: 'notEqual' },
                          { label: '大于', value: 'greaterThan' }
                        ]
                      }
                    },
                    labelPosition: 'left'
                  },
                  {
                    label: '比较值',
                    property: 'comparison-value',
                    widget: { component: 'BindVariable', props: { type: 'state' } },
                    labelPosition: 'left'
                  }
                ],
                props: {}
              },
              labelPosition: 'top'
            }
          ]
        }
      ]
    },
    ports: [
      {
        id: 'input',
        type: 'target',
        description: '输入端口,接收上一个节点的输出'
      },
      {
        id: 'else',
        type: 'source',
        description: 'ELSE分支端口,当所有条件都不满足时执行'
      },
      {
        id: 'if-{branchId}',
        type: 'source',
        description: 'IF/ELIF分支端口,每个条件分支都有一个对应的输出端口',
        dynamic: true,
        example: 'if-abc123, if-def456'
      }
    ],
    configure: {
      canConfig: true
    }
  }
}

开始节点(NodeStart)

工作流的入口节点,每个工作流必须包含一个开始节点。

  • 不可配置 — 无属性面板
  • 端口:1 个输出端口(output),连接到下一个节点

使用方式

开始节点自动创建,无需手动添加。工作流触发时从开始节点沿连线依次执行。


条件分支(NodeCondition)

根据条件判断走不同分支,支持多个 IF/ELIF 分支和一个 ELSE 默认分支。

端口

端口方向说明
input输入接收上游节点输出
if-{branchId}输出IF/ELIF 分支端口,动态生成,每个条件对应一个
else输出ELSE 分支,所有条件都不满足时执行

配置项

属性说明
条件列表添加多个条件分支,每个条件包含:被比较值、条件类型、比较值
被比较值要参与比较的数据,绑定状态变量
条件类型比较运算符
比较值与被比较值进行对比的参照值

条件类型

运算符
包括include
不包括exclude
不为空notEmpty
等于equal
不等于notEqual
大于greaterThan
小于lessThan
大于等于greaterThanEqual
小于等于lessThanEqual

使用方式

  1. 添加条件分支,设置被比较值和比较值
  2. if-{branchId} 端口连线到条件满足时的执行节点
  3. else 端口连线到所有条件都不满足时的执行节点
  4. 多个条件按顺序判断,命中第一个满足的条件后执行对应分支

循环体(NodeLoop)

支持三种循环方式:遍历数组、固定次数、条件循环。

端口

端口方向说明
input输入接收上游节点输出
output输出循环正常完成后继续执行
breakLoop输出循环体中使用了跳出循环节点时执行
error输出循环执行过程中发生异常时执行

配置项

属性说明可见条件
循环类型遍历数组 / 固定次数 / 条件循环始终可见
循环变量要遍历的数组变量循环类型 = 遍历数组
循环次数固定次数循环的次数(1-999)循环类型 = 固定次数
说明提示端口说明始终可见

循环类型

类型说明
遍历数组forEach遍历状态变量中的数组
固定次数forCount按指定次数循环执行
条件循环while持续循环,通过(NodeBreakLoop)节点跳出

使用方式

  1. 选择循环类型并配置对应参数
  2. 将需要循环执行的节点拖入循环节点内部
  3. output 端口连线到循环完成后的执行节点
  4. breakLoop 端口连线到需要跳出循环时的处理节点
  5. error 端口连线到异常处理节点(可选)

跳出循环(NodeBreakLoop)

提前终止当前循环,类似 JavaScript 中的 break

  • 不可配置 — 无属性面板
  • 端口:1 个输入端口(input),无输出端口

使用方式

放置在循环节点内部,执行到此节点时立即终止循环,触发循环体的 breakLoop 端口。


云函数(NodeCode)

执行页面中定义的云函数,支持传入变量和输出返回值。

端口

端口方向条件说明
input输入接收上游节点输出
output输出云函数执行完成后继续执行
error输出异常分支 = 异常分支云函数执行失败时执行

配置项

属性说明
执行函数绑定需要执行的云函数(从 cloudFuns 中选择)
传入变量传递给云函数的变量列表,每个变量绑定一个状态值
输出变量云函数返回数据赋值给该状态变量
异常分支执行异常后的处理方式:无 / 默认值 / 异常分支
异常返回值异常时返回的默认数据(JSON 格式,异常分支 = 默认值时可见)

异常分支策略

策略说明
none异常时中断执行
默认值default异常时返回预设的默认值,继续执行
异常分支branch异常时走 error 端口连接的分支

使用方式

  1. 在页面的云函数面板中定义函数逻辑
  2. 在节点中绑定该云函数
  3. 配置传入变量(函数参数)和输出变量(函数返回值)
  4. 根据需要配置异常处理策略

HTTP请求(NodeHttp)

发起 HTTP 请求并处理响应数据,支持跨域代理、重试策略、异常处理。

端口

端口方向条件说明
input输入接收上游节点输出
output输出请求成功后继续执行
error输出异常分支 = 异常分支请求失败时执行

配置项

属性说明
数据源绑定请求数据源(从 dataSource 中选择)
请求参数配置请求参数列表(参数名 + 参数值)
参数位置Query / Body / Form
请求超时超时时间(1000-12000 毫秒)
返回数据绑定绑定返回数据到状态变量
解构响应数据是否对响应数据进行解构提取
解构路径数据解构路径,如 data.results

高级配置

属性说明
跨域代理是否通过代理服务器发送请求
代理地址代理服务器 URL
失败时重试请求失败时是否自动重试
重试次数最大重试次数(1-3)
重试间隔重试间隔时间(1000-8000 毫秒)
异常分支请求异常后的处理方式:无 / 默认值 / 异常分支

使用方式

  1. 先在页面的数据源面板中配置接口地址和请求方法
  2. 在节点中绑定该数据源
  3. 配置请求参数和返回数据绑定变量
  4. 如需提取嵌套数据,开启解构并填写路径(如 data.list
  5. 根据需要配置代理、重试和异常处理

延迟(NodeDelay)

暂停指定时间后继续执行后续节点。

端口

端口方向说明
input输入接收上游节点输出
output输出延迟结束后继续执行

配置项

属性说明
延迟时间延迟时长数值
时间单位毫秒 / 秒 / 分钟

使用方式

常用于等待动画完成、接口轮询间隔等场景。设置延迟时间和单位即可。


物料事件(NodeComponent)

绑定组件的事件触发,当组件触发指定事件时执行对应分支。

端口

端口方向说明
event-{branchId}输出事件分支端口,动态生成,每个事件对应一个
  • 不可配置 — 节点会在物料添加事件时自动生成

使用方式

  1. 在画布中选中组件
  2. 在右侧事件面板中添加事件并绑定工作流
  3. 物料事件节点会自动创建,端口与绑定的事件一一对应
  4. 从对应事件端口连线到需要执行的节点

合并变量(NodeMerging)

将多个变量合并为一个对象,赋值给输出变量。

端口

端口方向说明
input输入接收上游节点输出
output输出变量合并完成后继续执行

配置项

属性说明
变量列表要参与合并的变量列表,每个变量绑定一个状态值
输出变量合并后的数据赋值给该状态变量

使用方式

  1. 添加需要合并的变量到列表中
  2. 指定输出变量接收合并结果
  3. 合并结果为 { 变量1名: 变量1值, 变量2名: 变量2值, ... } 格式的对象

切换页面(NodeSwitchPage)

切换到指定页面,支持页面切换动画。

端口

端口方向说明
input输入接收上游节点输出
  • 无输出端口 — 执行后切换到目标页面

配置项

属性说明
目标页面选择需要跳转到的页面(自动排除当前页面)
动画类型页面切换动画

动画类型

动画
none
右滑入slide-in-right
左滑入slide-in-left
淡入fade-in
缩放zoom-out
淡入缩放zoom-fade-out

使用方式

  1. 选择目标页面(页面列表从项目页面中动态获取)
  2. 选择动画类型(仅 UniApp 环境支持动画)
  3. 执行到此节点时自动跳转到目标页面

赋值变量(NodeVariableAssign)

修改页面状态变量的值,支持覆盖、清空、设置三种赋值方式。

端口

端口方向说明
input输入接收上游节点输出
output输出变量赋值完成后继续执行

配置项

属性说明
变量列表变量赋值列表,每项包含:变量、赋值类型、赋值内容
变量需要赋值的状态变量
赋值类型覆盖 / 清空 / 设置
赋值内容赋值的 JSON 内容(赋值类型 ≠ 清空时可见)

赋值类型

类型说明
覆盖override完全替换变量值
清空clear将变量置为空值
设置set设置变量的部分属性

使用方式

  1. 选择需要修改的状态变量
  2. 选择赋值类型
  3. 填写赋值内容(JSON 格式)
  4. 可同时修改多个变量,按顺序依次执行

流程注释(NodeNote)

为工作流添加说明文字,不影响执行逻辑。

  • 不可配置 — 无属性面板
  • 无端口 — 不参与流程连线

使用方式

编辑注释文本。用于标注复杂逻辑的用途、注意事项等,类似代码中的注释。