ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ToolJet 工作流 Response 节点配置指南:用 JavaScript 定制工作流返回结果

ToolJet 工作流 Response 节点配置指南:用 JavaScript 定制工作流返回结果 ToolJet 工作流 Response 节点配置指南用 JavaScript 定制工作流返回结果【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet导读在 ToolJet 的可视化工作流中Response 节点是决定最终返回什么的出口你可以通过一段 JavaScript 代码把工作流中任意节点的数据——无论是单条记录、完整数据集还是加工后的 CSV——组合成结构化的响应对象。本文以官方文档 results.md 为核心结合仓库中的工作流执行引擎源码系统讲解单节点返回、多节点返回、JavaScript 数据精调以及工作流在 Webhook 触发与 ToolJet 应用内触发两种场景下的结果返回行为。读完本文你将能独立配置出返回任意结构、任意子集数据的 Response 节点并理解其结果在 API 层是如何被组装与交付的。什么是 Response 节点Response 节点是工作流画布中的终端节点负责定义整个工作流对外输出的数据形状。它的配置界面本质上是一个 JavaScript 代码编辑器——你写入的表达式会按代码语义求值并把结果作为工作流的最终响应返回。从源码视角看Response 节点在整个执行引擎中承担着收尾写响应的职责。仓库中 server/src/modules/workflows/AGENTS.md 明确将其描述为Response Node— terminal node that writes the HTTP response for webhook-triggered runs (custom status code, may be fx-evaluated)由执行服务中的processResponseNodebuildResponseNodeMetadata负责处理。也就是说当工作流通过 Webhook 触发时Response 节点不仅要产出数据还要参与 HTTP 响应的构建包括自定义状态码。执行服务接口 IWorkflowExecutionsService.ts 中定义的ResponseNodeMetadata印证了这一点export interface ResponseNodeMetadata { status: ok | failed; request?: Recordstring, unknown; response: { statusCode?: number; headers?: { X-Workflow-Response-Status-Set: boolean; }; }; }status标识执行成败response.statusCode允许自定义 HTTP 状态码X-Workflow-Response-Status-Set头则标记状态码是否由 Response 节点显式设定——这些都是理解工作流 API 响应行为的关键细节。此外文档明确指出每个工作流可以有多个 Response 节点。你可以依据不同的分支路径如 If 条件节点后的成功/失败分支配置多个出口每个出口返回各自适合的结果结构。上图展示了 Response 节点的典型配置场景画布左侧是getStudentsData→calPercentage→sendMarksheet→If condition的链路右侧的 Response 节点面板中核心的Response object编辑区填写了return ({ output: success })即返回一个包含output字段的对象。从单个节点返回数据最常见的使用方式是把工作流中某个节点通常是经过 JavaScript 运算的最终数据处理节点的整体输出直接作为响应。考虑这样一个场景一个工作流通过getSalesData节点获取销售数据、通过getInventory节点获取库存数据再由generateCSVData节点用 JavaScript 运算把两者合并生成 CSV 文件。此时只需要在 Response 节点中写return ({generateCSVData})({generateCSVData})是 JavaScript 的对象简写语法等价于{ generateCSVData: generateCSVData }——它把generateCSVData节点返回的完整数据对象作为响应的generateCSVData字段返回。这条返回语句会在执行引擎的 JavaScript 沙箱中求值。根据 AGENTS.md工作流执行以 BullMQ 作业的形式运行在isolated-vm的 JS 沙箱中节点逐个执行并持久化每个节点的执行结果WorkflowExecutionNode中保存每个节点的result与state。Response 节点正是读取这些已落盘的上游节点结果再通过return语句将它们组合输出。从多个节点返回数据Response 节点同样可以自由引用其他任意节点的数据有两种做法返回完整数据集直接把节点整体放入返回对象只返回所需部分通过.data等属性访问节点输出中的特定字段。官方文档给出的多节点示例return ({sales: getSalesData.data, inventory: getInventory.data, csv: generateCSVData.data})注意这里与单节点返回的差异单节点示例直接返回generateCSVData这个节点对象而多节点示例显式访问了.data属性。这是因为当返回对象由多个字段组成时你通常关心的是各节点实际产生的数据.data而非包含元数据的节点包装对象。实践上建议统一使用.data访问让响应结构更干净、可预测。这种写法把三个数据源组合成一个平铺的对象sales、inventory、csv下游消费方API 调用者或 ToolJet 应用内的查询可以按字段名直接取值。用 JavaScript 精调返回数据Response 节点的返回表达式不限于原样透传你可以对数据执行任意 JavaScript 操作例如数组方法、映射、过滤、排序等。文档以slice为例只取每个数据集的前 5 条记录return ({sales: getSalesData.data.slice(0,5), inventory: getInventory.data.slice(0,5), csv: generateCSVData.data})这就实现了只把数据子集暴露给外部的典型需求——例如接口只需要最近 5 笔销售记录用于预览看板而不希望把全量数据带出工作流。在此基础上可以组合更丰富的变换例如return ({topProducts: getSalesData.data .sort((a, b) b.revenue - a.revenue) .slice(0, 10) .map((item) ({ name: item.product, revenue: item.revenue })), inventorySummary: { total: getInventory.data.length, lowStock: getInventory.data.filter((item) item.stock 10) }})需要注意文档示例中的return与对象之间跨行书写是合法的 JS 语法return后换行再跟括号表达式但为了可读性和规避 ASI自动分号插入陷阱更推荐将return与(保持在同一行即return ({ ... })的写法。配置面板本身是一段 JavaScript 求值环境表达式遵循标准 ES 语法你还可以引用fx求值相关的上下文变量Response 节点支持 fx-evaluated见 AGENTS.md实现动态化响应。工作流执行结果如何被返回Response 节点配置完成后其返回数据会在工作流执行的两种典型触发方式下以不同形态交付通过 Webhook / API 触发时当工作流通过外部触发器Webhook执行时Response 节点中配置的数据会包含在 API 响应中直接返回给调用方。从 workflow-executions.controller.ts 可以看到执行接口POST /workflow_executions的返回类型被定义为Promise{ workflowExecution: WorkflowExecution; result: any }其中result即工作流最终产出——也就是 Response 节点return的对象。类似地从 ToolJet 应用内触发的执行接口POST :id/trigger见 workflow-executions.controller.ts返回Promise{ result: any }这也对应了文档的说明当工作流在 ToolJet 应用内被触发时返回的数据会以与常规查询query完全相同的格式交付——也就是说你在应用构建器中运行一个工作流查询得到的data就是 Response 节点定义的结构可以直接绑定到组件或用于后续 JS 处理无需额外解析。关于响应状态码由于 Response 节点承担 HTTP 响应写入职责你还可以借助自定义状态码区分业务结果。ResponseNodeMetadata.response.statusCode字段与X-Workflow-Response-Status-Set头见 IWorkflowExecutionsService.ts表明当 Response 节点显式设置了状态码时执行引擎会标记该头调用方据此判断状态码是否为工作流自定义。这一机制让业务失败也返回 200、业务成功返回 200或反向定制成为可能适合对接外部系统的复杂契约。执行状态与实时反馈需要补充的是Response 节点只是结果的出口一次完整执行的生命周期由执行引擎全程跟踪工作流执行状态在triggered/running/completed/error/terminated之间流转见 AGENTS.md并通过 SSE 流式推送给前端。你可以通过GET /workflow_executions/:id/status查询单次执行的节点明细——每个节点含 Response 节点都会记录executed布尔值与result结果见 IWorkflowExecutionsService.ts用于排查返回的数据是否符合预期。配置要点与最佳实践综合文档与源码整理出以下实操要点多出口设计一个工作流可配置多个 Response 节点适合按分支成功/失败/不同条件路径返回差异化结构。配合 If 条件节点可以让错误分支返回带error字段的对象成功分支返回业务数据。善用.data访问节点输出多节点组合返回时显式使用getSalesData.data这类属性访问避免把节点的内部包装结构泄露给调用方。返回表达式是完整 JS 上下文slice、sort、map、filter等标准数组方法均可使用可在 Response 节点内完成字段裁剪、重命名、聚合等收尾加工减少下游处理成本。保持return语法安全推荐return ({ ... })单行书写风格规避 ASI 陷阱与跨行可读性问题。结果位置因触发方式而异Webhook 调用方从 HTTP 响应体取result应用内触发时工作流查询的返回数据即 Response 节点结构与常规查询一致。执行环境限制Response 节点的 JS 在isolated-vm沙箱中求值且默认执行超时受WORKFLOW_TIMEOUT_SECONDS默认 60 秒约束见 AGENTS.md因此返回表达式应保持轻量避免在响应阶段做重计算。小结Response 节点是 ToolJet 工作流对外输出能力的核心一条return语句即可把任意节点数据组合为结构化响应配合 JavaScript 内置方法可以实现数据裁剪、排序、聚合等精细控制在执行层面Webhook 触发时结果进入 HTTP 响应含可自定义的状态码应用内触发时则以常规查询格式交付。结合执行服务中processResponseNode与buildResponseNodeMetadata的职责划分见 AGENTS.md你既可以把它当作数据出口也可以进一步利用自定义状态码机制让工作流在对接外部系统时拥有更完整的 HTTP 语义。【免费下载链接】ToolJetOpen-source foundation of ToolJet AI - the enterprise app generation platform for internal tools, dashboards, business applications, workflows and AI agents. Build visually, from a prompt, or from Claude Code, Codex and Cursor over MCP 项目地址: https://gitcode.com/GitHub_Trending/to/ToolJet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表