跳到主要内容

JavaScript 执行器工具

JavaScript 执行器工具允许您在工作流中安全地执行自定义 JavaScript 代码,提供强大的数据处理和转换能力。代码在安全沙盒中运行,内置丰富的工具函数。

配置参数

参数类型默认值说明
timeoutnumber30000执行超时时间(毫秒),范围 1000–300000
allowAsyncbooleanfalse是否允许异步操作
allowedModulesArray[]允许的模块列表,可选值:lodashmomentcrypto
maxMemorynumber52428800内存限制(字节),默认 50MB

输入参数

参数类型必填说明
codestring要执行的 JavaScript 代码,最大 100KB(100,000 字符)
parametersobject传递给沙盒的参数,在代码中通过 parametersparams 访问

输出结构

成功时

{
"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_processclusterworker_threads
动态执行eval()Function()vm.*
原型链constructorprototypethis.constructorarguments.callee

沙盒中 setTimeoutsetIntervalclearTimeoutclearInterval 均被设为 undefined

最佳实践

  1. 明确返回值:始终使用 return 语句返回结果
  2. 数据验证:处理用户输入前使用 utils.validate 进行验证
  3. 错误处理:使用 try-catch 包裹主要逻辑
  4. 类型检查:使用 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 签名、令牌生成