JavaScript 执行器工具
JavaScript 执行器工具允许您在工作流中安全地执行自定义 JavaScript 代码,提供强大的数据处理和转换能力。代码在安全沙盒中运行,内置丰富的工具函数。
配置参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
timeout | number | 30000 | 执行超时时间(毫秒),范围 1000–300000 |
allowAsync | boolean | false | 是否允许异步操作 |
allowedModules | Array | [] | 允许的模块列表,可选值:lodash、moment、crypto |
maxMemory | number | 52428800 | 内存限制(字节),默认 50MB |
输入参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
code | string | ✅ | 要执行的 JavaScript 代码,最大 100KB(100,000 字符) |
parameters | object | ❌ | 传递给沙盒的参数,在代码中通过 parameters 或 params 访问 |
输出结构
成功时
{
"result": "用户代码的返回值",
"executedAt": "2025-06-15T10:30:00.000Z",
"codeLength": 150,
"executionTime": 12
}
失败时
{
"error": "错误信息",
"executedAt": "2025-06-15T10:30:00.000Z",
"codeLength": 150,
"failed": true
}
快速开始
在工作流中添加 JavaScript 执行器节点,编写处理逻辑:
// 获取输入参数
const userAge = parameters.age;
const userName = parameters.name;
// 数据处理
if (utils.isNumber(userAge) && userAge >= 18) {
return {
message: `欢迎 ${userName},您已成年`,
category: 'adult',
canAccess: true
};
} else {
return {
message: `${userName},您还未成年`,
category: 'minor',
canAccess: false
};
}
沙盒可用功能
输入参数访问
parameters.参数名— 访问节点输入参数(推荐)params.参数名— 访问节点输入参数(简写别名)context.节点ID.result— 访问其他节点的执行结果(只读深拷贝)
utils 工具函数
类型检查
utils.isString(value) // 是否为字符串
utils.isNumber(value) // 是否为数字(且非 NaN)
utils.isInteger(value) // 是否为整数(Number.isInteger)
utils.isFloat(value) // 是否为浮点数(数字且非整数)
utils.isBoolean(value) // 是否为布尔值
utils.isObject(value) // 是否为对象(非 null、非数组)
utils.isArray(value) // 是否为数组(Array.isArray)
utils.isFunction(value) // 是否为函数
utils.isNull(value) // 是否为 null
utils.isUndefined(value) // 是否为 undefined
utils.isEmpty(value) // 是否为空(null/undefined/空串/空数组/空对象)
utils.isEmail(value) // 是否为邮箱格式(正则校验)
utils.isURL(value) // 是否为 URL 格式(new URL() 校验)
utils.isJSON(value) // 是否为合法 JSON 字符串(JSON.parse 校验)
数据验证
utils.validate.required(value, fieldName) // 必填验证,为空时抛出 "fieldName is required"
utils.validate.minLength(value, min, fieldName) // 最小长度验证
utils.validate.range(value, min, max, fieldName) // 数值范围验证
数据处理
utils.deepClone(obj) // 深拷贝(JSON 序列化方式)
utils.merge(...objects) // 合并对象(Object.assign({}, ...objects))
utils.pick(obj, keys) // 选取对象中的指定键
字符串处理
utils.trim(str) // 去除首尾空格
utils.uppercase(str) // 转换为大写
utils.lowercase(str) // 转换为小写
utils.capitalize(str) // 首字母大写,其余小写
utils.camelCase(str) // 转换为驼峰命名
utils.truncate(str, length, suffix) // 截断字符串(默认后缀 '...')
数组处理
utils.unique(arr) // 数组去重(Set 方式)
utils.flatten(arr, depth) // 数组扁平化(默认深度 1)
utils.chunk(arr, size) // 数组分块
utils.shuffle(arr) // 随机打乱数组(Fisher-Yates 算法)
对象处理
utils.keys(obj) // Object.keys
utils.values(obj) // Object.values
utils.entries(obj) // Object.entries
utils.hasProperty(obj, prop) // 检查对象是否拥有属性
数学工具
utils.math.sum(arr) // 数组求和
utils.math.average(arr) // 数组平均值
utils.math.max(arr) // 最大值
utils.math.min(arr) // 最小值
utils.math.round(num, decimals) // 四舍五入(默认 0 位小数)
日期工具
utils.date.formatDate(date, locale) // 格式化日期(默认 'zh-CN')
utils.date.toISOString(date) // 转 ISO 8601 字符串
utils.date.addDays(date, days) // 日期加/减天数
格式化工具
utils.format.bytes(bytes, decimals) // 字节格式化 → "1 KB"(默认 2 位小数)
utils.format.currency(amount, currency, locale) // 货币格式化(默认 CNY, zh-CN)
安全工具
utils.security.generateId(length) // 生成随机字母数字 ID(默认 16 位)
utils.security.generateUUID() // 生成 v4 UUID
utils.security.base64Encode(str) // Base64 编码
utils.security.base64Decode(str) // Base64 解码
crypto 加密模块
需要启用
crypto 模块需要管理员在配置中将 allowedModules 设为包含 'crypto' 的数组才可用。
哈希计算
crypto.hash.md5(data) // MD5 哈希(hex)
crypto.hash.sha1(data) // SHA-1 哈希(hex)
crypto.hash.sha256(data) // SHA-256 哈希(hex)
crypto.hash.sha512(data) // SHA-512 哈希(hex)
HMAC 签名
crypto.hmac.sha256(data, key) // HMAC-SHA256 签名(hex)
crypto.hmac.sha512(data, key) // HMAC-SHA512 签名(hex)
编码工具
crypto.encoding.base64Encode(data) // Base64 编码
crypto.encoding.base64Decode(data) // Base64 解码 → utf8 字符串
crypto.encoding.hexEncode(data) // Hex 编码
crypto.encoding.hexDecode(data) // Hex 解码 → utf8 字符串
安全随机数
crypto.secure.randomString(length, chars) // 随机字符串(默认 32 位,A-Za-z0-9)
crypto.secure.randomHex(length) // 随机 hex 字符串(默认 32 位)
crypto.secure.randomBase64(length) // 随机 base64 字符串(默认 32 位)
crypto.secure.randomInt(min, max) // 随机整数(包含 max)
底层 API
crypto.createHash(algorithm) // 创建 Hash 实例
crypto.createHmac(algorithm, key) // 创建 Hmac 实例
crypto.randomBytes(size) // 随机字节 Buffer
crypto.randomUUID() // UUID 字符串
crypto.randomInt(min, max) // 随机整数
实用示例
1. 用户数据验证和处理
const email = parameters.email;
const name = parameters.name;
try {
utils.validate.required(email, '邮箱');
utils.validate.required(name, '姓名');
if (!utils.isEmail(email)) {
throw new Error('邮箱格式不正确');
}
return {
success: true,
user: {
email: utils.lowercase(email),
name: utils.capitalize(name),
registeredAt: new Date().toISOString()
}
};
} catch (error) {
return { success: false, error: error.message };
}
2. 数据统计和分析
const orders = parameters.orders || [];
const amounts = orders.map(order => order.amount);
const totalAmount = utils.math.sum(amounts);
const averageAmount = utils.math.average(amounts);
return {
summary: {
totalOrders: orders.length,
totalAmount: utils.math.round(totalAmount, 2),
averageAmount: utils.math.round(averageAmount, 2),
maxAmount: utils.math.max(amounts),
minAmount: utils.math.min(amounts),
currency: utils.format.currency(totalAmount)
},
reportGeneratedAt: utils.date.formatDate(new Date())
};
3. 上下文数据处理
访问工作流中其他节点的数据:
// 获取前一个节点的结果(context 为只读深拷贝)
const previousData = context.dataProcessorNode?.result?.data;
if (previousData && utils.isArray(previousData)) {
const enhanced = previousData.map(item => ({
...utils.deepClone(item),
processed: true,
timestamp: new Date().toISOString(),
userInput: parameters.userInput
}));
return {
source: 'previous_node',
count: enhanced.length,
data: enhanced
};
}
return { message: '没有找到前置数据' };
4. 加密和签名
// 需要启用 crypto 模块
const password = parameters.password;
const apiSecret = parameters.apiSecret;
const payload = parameters.payload;
// 密码哈希
const hashedPassword = crypto.hash.sha256(password);
// API 签名
const signature = crypto.hmac.sha256(
JSON.stringify(payload),
apiSecret
);
// 生成安全令牌
const token = crypto.secure.randomHex(32);
return {
hashedPassword,
signature,
token,
encodedPayload: crypto.encoding.base64Encode(JSON.stringify(payload))
};
安全限制
代码在安全沙盒中执行,以下操作被禁止:
| 类别 | 禁止内容 |
|---|---|
| 模块导入 | require()、import |
| 全局访问 | process.*、global.* |
| 文件系统 | fs.*、__dirname、__filename |
| 进程管理 | child_process、cluster、worker_threads |
| 动态执行 | eval()、Function()、vm.* |
| 原型链 | constructor、prototype、this.constructor、arguments.callee |
沙盒中 setTimeout、setInterval、clearTimeout、clearInterval 均被设为 undefined。
最佳实践
- 明确返回值:始终使用
return语句返回结果 - 数据验证:处理用户输入前使用
utils.validate进行验证 - 错误处理:使用 try-catch 包裹主要逻辑
- 类型检查:使用
utils.is*方法检查数据类型
// 推荐的代码结构
try {
// 1. 参数验证
const input = parameters.input;
utils.validate.required(input, '输入数据');
// 2. 数据处理
const result = processData(input);
// 3. 返回结果
return {
success: true,
data: result,
timestamp: new Date().toISOString()
};
} catch (error) {
return {
success: false,
error: error.message
};
}
常见用途
- 数据验证:验证用户输入的格式和有效性
- 数据转换:格式化、清理和转换数据
- 条件逻辑:根据条件执行不同的处理分支
- 数据统计:计算总和、平均值、计数等统计信息
- 文本处理:字符串格式化、截断、大小写转换
- 数组操作:过滤、排序、分组、去重等操作
- 加密签名:密码哈希、API 签名、令牌生成