跳到主要内容

JavaScript执行器工具

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

🚀 快速开始

基本用法

在工作流中添加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.isString(value)     // 检查是否为字符串
utils.isNumber(value) // 检查是否为数字
utils.isEmail(value) // 检查是否为邮箱格式
utils.isURL(value) // 检查是否为URL格式
utils.isEmpty(value) // 检查是否为空值

数据验证

utils.validate.required(value, '字段名')           // 必填验证
utils.validate.minLength(value, 5, '密码') // 最小长度验证
utils.validate.range(value, 1, 100, '年龄') // 数值范围验证

字符串处理

utils.trim(str)                    // 去除首尾空格
utils.uppercase(str) // 转换为大写
utils.lowercase(str) // 转换为小写
utils.capitalize(str) // 首字母大写
utils.camelCase('hello-world') // 转换为驼峰命名 → helloWorld
utils.truncate(str, 20) // 截断字符串

数组操作

utils.unique([1,2,2,3])            // 数组去重 → [1,2,3]
utils.chunk([1,2,3,4,5], 2) // 数组分块 → [[1,2],[3,4],[5]]
utils.shuffle([1,2,3]) // 随机打乱数组

数学计算

utils.math.sum([1,2,3,4])          // 求和 → 10
utils.math.average([1,2,3,4]) // 平均值 → 2.5
utils.math.max([1,2,3,4]) // 最大值 → 4
utils.math.round(3.14159, 2) // 四舍五入 → 3.14

日期处理

utils.date.formatDate(new Date())           // 格式化日期
utils.date.addDays(new Date(), 7) // 日期加7天
utils.date.toISOString(new Date()) // 转ISO字符串

格式化工具

utils.format.bytes(1024)                    // 字节格式化 → "1 KB"
utils.format.currency(1234.56) // 货币格式化 → "¥1,234.56"

安全工具

utils.security.generateId(8)                // 生成8位随机ID
utils.security.generateUUID() // 生成UUID
utils.security.base64Encode('hello') // Base64编码
utils.security.base64Decode('aGVsbG8=') // Base64解码

💡 实用示例

1. 用户数据验证和处理

const email = parameters.email;
const phone = parameters.phone;
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),
phone: phone || '',
registeredAt: new Date().toISOString()
}
};
} catch (error) {
return {
success: false,
error: error.message
};
}

2. 数据统计和分析

const orders = parameters.orders || [];

// 数据分析
const totalAmount = utils.math.sum(orders.map(order => order.amount));
const averageAmount = utils.math.average(orders.map(order => order.amount));
const orderCount = orders.length;

// 按状态分组
const statusGroups = orders.reduce((groups, order) => {
const status = order.status;
groups[status] = (groups[status] || 0) + 1;
return groups;
}, {});

return {
summary: {
totalOrders: orderCount,
totalAmount: utils.math.round(totalAmount, 2),
averageAmount: utils.math.round(averageAmount, 2),
currency: utils.format.currency(totalAmount)
},
statusBreakdown: statusGroups,
reportGeneratedAt: utils.date.formatDate(new Date())
};

3. 文本内容处理

const content = parameters.content || '';
const maxLength = parameters.maxLength || 100;

// 文本处理
const processed = {
original: content,
cleaned: utils.trim(content),
wordCount: content.split(' ').length,
charCount: content.length,
summary: utils.truncate(content, maxLength),
isEmpty: utils.isEmpty(content),
hasEmail: /\S+@\S+\.\S+/.test(content),
processedAt: new Date().toISOString()
};

// 生成处理ID
processed.id = utils.security.generateId(12);

return processed;

4. 数组数据转换

const users = parameters.users || [];

// 数据转换和增强
const processedUsers = users
.filter(user => user.active) // 只处理活跃用户
.map(user => ({
id: user.id,
name: utils.capitalize(user.name),
email: utils.lowercase(user.email),
isValidEmail: utils.isEmail(user.email),
joinDate: utils.date.formatDate(user.joinDate),
category: user.age >= 18 ? 'adult' : 'minor'
}));

// 数据分组
const chunks = utils.chunk(processedUsers, 10); // 每组10个用户

return {
total: users.length,
processed: processedUsers.length,
batches: chunks.length,
data: processedUsers,
batches: chunks
};

🔧 高级功能

加密和哈希(需要启用)

当管理员启用加密模块时,您可以使用:

// 哈希计算
const password = parameters.password;
const hashedPassword = crypto.hash.sha256(password);

// 生成安全随机数
const token = crypto.secure.randomHex(32);
const sessionId = crypto.secure.randomString(16);

return {
hashedPassword: hashedPassword,
token: token,
sessionId: sessionId
};

上下文数据处理

访问工作流中其他节点的数据:

// 获取前一个节点的结果
const previousData = context.dataProcessorNode?.result?.data;

if (previousData && utils.isArray(previousData)) {
// 对前一个节点的数据进行进一步处理
const enhanced = previousData.map(item => ({
...item,
processed: true,
timestamp: new Date().toISOString(),
userInput: parameters.userInput
}));

return {
source: 'previous_node',
count: enhanced.length,
data: enhanced
};
}

return { message: '没有找到前置数据' };

⚠️ 注意事项

安全限制

  • 代码在安全沙盒中执行,无法访问文件系统或网络
  • 不能使用 require()import 等模块导入语句
  • 禁止使用 eval()Function() 等动态代码执行

性能建议

  • 避免复杂的循环和递归操作
  • 处理大量数据时注意内存使用
  • 代码长度限制为100KB

最佳实践

  1. 明确返回值:始终使用 return 语句返回结果
  2. 数据验证:处理用户输入前进行验证
  3. 错误处理:使用 try-catch 处理可能的错误
  4. 类型检查:使用工具函数检查数据类型
// 推荐的代码结构
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
};
}

🎯 常见用途

  • 数据验证:验证用户输入的格式和有效性
  • 数据转换:格式化、清理和转换数据
  • 条件逻辑:根据条件执行不同的处理分支
  • 数据统计:计算总和、平均值、计数等统计信息
  • 文本处理:字符串格式化、截断、大小写转换
  • 数组操作:过滤、排序、分组、去重等操作

JavaScript执行器为您的工作流提供了强大而灵活的数据处理能力,让您能够实现复杂的业务逻辑和数据转换需求。