ToolJet RunJS 数据源详解:在内部工具应用中执行自定义 JavaScript 代码

发布时间:2026/11/5 11:18:55

ToolJet RunJS 数据源详解:在内部工具应用中执行自定义 JavaScript 代码 ToolJet RunJS 数据源详解在内部工具应用中执行自定义 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/ToolJetRun JavaScript CodeRunJS是 ToolJet 内置的一种数据源类型它允许你在查询管理器中直接编写并执行自定义 JavaScript用于完成计算、生成动态值、加工数据以及与查询和组件进行交互。本文将以 ToolJet 3.0.0-LTS 文档为骨架结合仓库源码完整讲解 RunJS 查询的创建方法、参数机制、跨查询调用、典型示例与底层执行原理读完你即可在应用构建器中熟练运用 RunJS 实现各类交互逻辑。RunJS 是什么RunJS 是 ToolJet 提供的静态数据源之一。从服务端源码看runjs与restapi、runpy、tooljetdb、workflows一同被定义在DefaultDataSourceKinds中见 server/src/modules/data-sources/constants/index.ts每个工作区会对应一行runjsdefault默认数据源记录。也就是说你不需要配置任何连接信息打开查询管理器即可直接使用。它的前端定义见 frontend/src/modules/common/components/DataSourceComponents/Runjs.schema.json揭示了其执行模型的关键信息source.kind为runjs数据源名称显示为Run JavaScript执行后默认暴露三个变量isLoading加载状态、data返回结果、rawData原始数据后续在表达式中可通过queries.查询名.data等方式读取开启customTesting自定义预览测试disableTransformations为true即 RunJS 查询本身不再走转换管道你直接在代码里处理数据即可。一个重要的执行模型事实是对于应用App中的 RunJS 查询代码是在浏览器端执行的只有当 RunJS 被用于工作流Workflow企业版功能时才会在服务端通过isolated-vm沙箱逐节点执行见 server/src/modules/data-queries/AGENTS.md 与 IUtilService.ts。因此在应用构建器中使用 RunJS 时代码可以访问浏览器环境如alert、Math等同时也应避免依赖仅存在于服务端的 API。创建 Run JavaScript 查询在应用编辑器中创建一个 RunJS 查询只需四步点击编辑器底部查询管理器的 Add按钮在可用数据源列表中选择Run JavaScript Code在代码编辑器中编写 JavaScript 代码点击Preview预览输出或点击Run立即触发查询。前端编辑器组件位于 frontend/src/AppBuilder/QueryManager/QueryEditors/Runjs/Runjs.jsx可以看到它复用了CodeHinter代码编辑器langjavascript、typemultiline、默认高度 400px初始占位代码为//Type your JavaScript code here每次编辑都会通过optionsChanged实时同步代码内容。查询代码以查询的options.code字段保存查询执行后代码的返回值即为查询结果可通过{{queries.查询名.data}}在任意组件属性或事件处理器中引用。参数机制动态控制代码输入参数Parameters允许你为同一个脚本提供不同的输入值从而在不改动核心代码的前提下复用查询提升灵活性。每个参数包含两个属性Name参数名称供代码引用Default value默认值可以是常量字符串、数字或对象。添加参数的步骤在 RunJS 查询编辑器中点击Parameters 按钮创建一个新参数为参数指定Name设置默认Value字符串、数字或对象均可。参数添加完成后在代码中通过parameters.name语法引用。例如定义参数newAlert其值为对象并在代码中调用alert(parameters.newAlert)查询被触发时alert弹窗将展示参数值这常用于快速验证参数传递是否生效。跨查询调用让一个查询以自定义参数调用另一个查询参数最常见的进阶用法是在 RunJS 中触发其他查询并传入自定义值。完整示例分为两步。第一步创建基础查询multiply新建 RunJS 查询并命名为multiply添加参数num1默认值10添加参数num2默认值2编写如下代码return parameters.num1 * parameters.num2;要展示结果可在画布上放置一个文本组件并将其文本设置为{{queries.multiply.data}}第二步创建调用方查询callMultiply再新建一个名为callMultiply的 RunJS 查询代码如下queries.multiply.run({num1: 20, num2: 7})执行callMultiply时会以num1 20、num2 7触发multiply查询并得到结果 140。由此multiply查询可以被任意其他查询反复调用每次传入不同的参数值实现真正的一次编写、多处复用。RunJS 示例查询集下面三个示例覆盖了最常见的 RunJS 使用场景均可在查询编辑器中直接复制运行。生成随机数该示例演示如何在按钮点击时生成随机数并实时显示在文本组件中。在画布上的容器组件中拖入一个按钮和一个文本组件在查询面板点击 Add选择Run JavaScript code数据源新建查询默认名如runjs1在代码编辑器中写入并运行const a Math.floor(Math.random() * (10 - 1)) 1; return a;配置组件属性为按钮添加事件处理器事件选择On Click动作选择Run Query目标查询选择runjs1——这样每次点击按钮都会执行这段随机数代码在文本组件的文本字段中填入Random number:{{queries.runjs1.data}}显示效果为Random number: 随机结果。生成唯一 ID以下代码生成形如id加随机十六进制字符序列的唯一 IDvar id id Math.random().toString(16).slice(2); return id;运行结果示例id2f4a1b。生成基于时间戳的唯一 ID下面的代码生成timestamp randomHex格式的 ID其中timestamp是当前时间戳的 base-32 表示randomHex是随机十六进制值return String(Date.now().toString(32) Math.random().toString(16)).replace(/\./g, );该 ID 比上一示例更长形如2g3h1d6a4h3适用于需要更高唯一性的场景。内置库与外部库导入RunJS 查询内部可直接使用以下三个常用库库名说明典型用法示例Moment日期时间处理库moment().format(YYYY-MM-DD)Lodash实用工具函数库_.map(data, item item.name)AxiosHTTP 请求库axios.get(url).then(res res.data)这三个库在 frontend/src/AppBuilder/_helpers/libraryLoader.js 中被显式导入作为执行环境的内置依赖注入到脚本作用域中。同时该文件实现了完整的外部库加载机制loadLibraryFromURL仅允许 HTTPS 地址通过 fetch 获取源码后用 UMD/IIFE shim模拟module/exports/define在沙箱中执行避免污染全局作用域initializeLibraries会并行加载实例设置中启用的第三方 JavaScript 库并将导出对象注册到库注册表中executePreloadedJS则把预加载代码的返回值须为对象展开为 RunJS 可用的顶层变量且会通过RESERVED_PARAMS过滤保留参数。关于在实例设置中添加自定义外部 JavaScript 库并配合 RunJS 使用的完整操作请参阅 导入外部 JavaScript 库。进阶技巧故意让查询失败以调试错误处理在调试事件处理器或验证错误分支时可以让 RunJS 查询主动抛错例如throw new ReferenceError(This is a reference error.);随后为该查询添加失败On Failure事件处理器如弹出告警再点击Run即可观察错误是否被正确捕获与处理。完整演练见 故意让 RunJS 查询抛出错误。定时触发 RunJS 查询RunJS 还可以配合定时触发机制按指定时间间隔自动执行例如轮询外部接口并刷新界面数据具体配置方法见 按指定时间间隔触发查询。小结RunJS 是 ToolJet 中打通数据计算—查询联动—界面呈现的高频数据源通过parameters语法实现参数化复用通过queries.name.run({...})实现查询间相互调用通过{{queries.name.data}}将结果绑定到任意组件再结合内置的 Moment、Lodash、Axios 以及可导入的外部库足以在纯前端完成绝大多数业务逻辑编排。理解其浏览器端执行模型与isLoading/data/rawData暴露变量能帮助你写出更健壮、更易维护的 RunJS 查询。【免费下载链接】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),仅供参考
延伸阅读

更多相关文章

2026/11/5 12:14:38

不用服务器也能做外卖红包CPS小程序?云开发模式全拆解

简介:这是一套面向个人开发者、主打零服务器成本的外卖红包CPS小程序源码,重点匹配微信小程序个人主体过审条件,让没有技术团队和独立后端预算的个人也能搭建属于自己的返利推广工具。压缩包约3.51MB,整体非常轻量,便于…

2026/11/5 13:50:18

基于Django的运维平台实战:资产、发布、巡检、告警一体化

简介:这份资源是一套基于Django框架开发的运维平台源码,面向具备Python基础、希望了解Web运维系统实现思路的开发者与运维人员,可用于学习主机管理、服务监控、日志查看、任务调度、权限控制、资源统计、脚本执行与故障告警等常见运维模块的落…

2026/11/5 13:25:11

基于ADS122U04IPWR与STM32F427ZI的工业测温方案设计

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 13:20:10

Dubbo服务下线实时告警:基于ZooKeeper Watch的轻量级监控方案

简介:这是一套面向Java分布式系统运维与开发人员的Dubbo服务高可用监控解决方案,聚焦于Provider异常下线的实时感知与告警响应。资源通过Zookeeper监听机制实现服务状态变更捕获,结合邮件通知模块,在不侵入原有Dubbo代码的前提下&…

2026/11/5 13:20:10

SSM超市管理系统源码解析:从分层架构到本地部署与业务修改

简介:这份资源是面向高校计算机专业学生与Java初学者的一套SSM框架课程设计完整项目,围绕超市管理场景,帮助读者完成从框架整合到业务模块落地的实战练习,适合作为毕业设计或课程作业的参考方案。压缩包共792个文件,约…

2026/11/5 13:20:10

SSM超市管理系统实战:从课设跑通到二次开发全解析

简介:这份资源是面向高校计算机相关专业学生与Java入门开发者的SSM课程设计参考项目,围绕超市管理场景,解决商品、库存、销售等业务模块从设计到落地的实践需求,适合作为课程作业、毕业设计原型或SSM框架练手案例。压缩包共792个文…

2026/11/5 13:15:07

PIPE4.3.0安装排错:JDK版本、JAVA_HOME与Petri验证

简介:PIPE 4.3.0 是一款基于 Petri 网的图形化建模与仿真软件,面向软件工程、系统分析与教学实验场景,帮助读者完成并发、同步与竞争等系统行为的建模、动态仿真及性质分析。压缩包共 2391 个文件,约 28.43MB,包含大量…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/5 0:02:07

多智能体协作系统架构设计与实践优化

1. 多智能体协作系统的时代背景2017年Transformer架构的诞生彻底改变了人工智能的发展轨迹。当行业还沉浸在单一大模型带来的性能突破时,Anthropic的研究团队已经将目光投向了更前沿的领域——如何让多个智能体通过协作产生超越单体能力的系统智能。这就像交响乐团中…

2026/11/5 0:02:07

大模型系统性入门实战指南:从原理到部署微调的全链路路线

提到大模型的系统性入门,我先说个结论:这事真不难,难的是资料太散、路线太多,今天这个框架明天那个工具,新人很容易在“收藏夹吃灰”和“教程看到一半放弃”之间反复横跳。市面上关于大模型的内容少说有几十万篇&#…

2026/11/5 0:02:07

鸿蒙文件系统沙箱机制解析与开发实践

1. 鸿蒙文件系统沙箱机制深度解析作为一名从Android转向鸿蒙开发的工程师,我深刻体会到文件系统访问是迁移过程中最先遇到的"拦路虎"。在Android上运行良好的文件读写代码,在鸿蒙真机环境却频频出现文件写入后神秘消失或直接抛出权限拒绝错误的…

2026/11/4 12:38:23

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/4 21:04:25

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑