1. n8n工作流变量配置基础
n8n作为一款开源的工作流自动化工具,其变量系统是整个平台最强大的功能之一。变量在n8n中扮演着数据传递和转换的关键角色,合理使用变量可以大幅提升工作流的灵活性和复用性。
1.1 变量类型详解
n8n支持多种变量类型,每种类型都有其特定的使用场景:
环境变量:存储在n8n配置文件中,适用于跨工作流共享的配置项。比如API密钥、服务器地址等敏感信息。通过
{{ $env.VARIABLE_NAME }}格式调用。工作流变量:作用于单个工作流内部,适合存储工作流级别的配置参数。使用
{{ $workflow.VARIABLE_NAME }}语法访问。节点变量:由各个节点输出的数据,是工作流中最重要的变量类型。格式为
{{ $node["节点名称"].json["属性名"] }}。临时变量:通过Function或Code节点创建的短期变量,仅在当前节点执行周期内有效。
重要提示:环境变量需要提前在n8n的配置文件中设置(通常是
~/.n8n/.env文件),修改后需要重启n8n服务才能生效。
1.2 变量引用实战
让我们通过一个实际案例来理解变量引用。假设我们有一个HTTP请求节点获取天气数据:
{ "city": "Beijing", "temperature": 28, "humidity": 65 }在后续节点中可以通过以下方式引用数据:
{{ $node["HTTP请求"].json["temperature"] }}获取温度值{{ $node["HTTP请求"].json["city"] }}获取城市名称
对于嵌套JSON数据,可以使用点号链式访问:
{ "data": { "weather": { "temp": 28 } } }引用方式为:{{ $node["节点名"].json["data.weather.temp"] }}
2. 多输入数据合并技术
在实际业务场景中,经常需要将来自不同来源的数据进行合并处理。n8n提供了多种实现方式,各有优缺点。
2.1 Merge节点方案
Merge节点是n8n内置的专业数据合并节点,支持多种合并模式:
| 模式类型 | 适用场景 | 特点说明 |
|---|---|---|
| Append | 简单数据拼接 | 将所有输入数组简单连接,保留原始结构 |
| Merge By Key | 基于键值合并 | 类似SQL的JOIN操作,需指定关键字段 |
| Merge By Position | 按位置合并 | 根据数组索引位置匹配数据 |
| Remove Key Matches | 键值去重合并 | 自动去除重复键值的数据 |
典型配置示例:
- 添加Merge节点到工作流
- 连接两个或多个数据输入分支
- 选择"Merge By Key"模式
- 设置关键字段如"id"或"orderNumber"
- 配置冲突处理策略(保留第一个/最后一个值)
2.2 Function节点方案
对于更复杂的合并逻辑,可以使用Function节点编写自定义JavaScript代码:
// 获取来自不同节点的输入数据 const input1 = $input.all()[0].json; const input2 = $input.all()[1].json; // 自定义合并逻辑 const mergedData = input1.map((item, index) => { return { ...item, ...input2.find((i) => i.id === item.id) }; }); // 返回合并结果 return mergedData;这种方式的优势在于:
- 可以处理任意复杂的合并逻辑
- 支持数据转换和计算
- 能够添加条件判断和错误处理
2.3 数据合并最佳实践
在实际项目中,我们总结出以下经验:
数据预处理:在合并前确保各数据源的结构尽可能一致,可以使用Item Lists节点的"Split Out"功能预处理数据。
键值选择:选择具有唯一性的字段作为合并键,避免使用可能重复的值如姓名、日期等。
性能优化:对于大数据集合并,建议:
- 先使用Filter节点减少数据量
- 在Function节点中使用高效算法(如建立索引对象)
- 考虑分批处理数据
错误处理:
try { // 合并操作 } catch (error) { // 记录错误信息 console.error('Merge failed:', error); // 可以选择返回部分数据或空数组 return []; }3. Code节点高级应用
Code节点是n8n中最灵活的节点之一,特别适合处理复杂的数据操作。
3.1 数据转换技巧
以下是一些实用的数据转换代码片段:
数组转对象字典:
const array = $input.all()[0].json; const dict = array.reduce((acc, item) => { acc[item.id] = item; return acc; }, {}); return dict;日期格式标准化:
const items = $input.all()[0].json; return items.map(item => { return { ...item, date: new Date(item.timestamp).toISOString().split('T')[0] }; });多语言文本处理:
const products = $input.all()[0].json; const translations = $input.all()[1].json; return products.map(product => { const translation = translations.find(t => t.product_id === product.id) || {}; return { ...product, title_en: product.title, title_zh: translation.title || product.title }; });3.2 外部库使用
Code节点支持引入外部npm库(需在n8n服务器上安装):
const _ = require('lodash'); const data1 = $input.all()[0].json; const data2 = $input.all()[1].json; return _.unionBy(data1, data2, 'id');常用实用库推荐:
lodash:数据操作工具集moment:日期时间处理axios:HTTP请求csv-parse/csv-stringify:CSV格式处理
注意:使用外部库需要确保n8n服务器上已安装相应依赖,可以通过SSH连接到服务器执行
npm install 包名命令。
4. 实战案例:简历筛选工作流
让我们通过一个完整的简历筛选案例,综合运用变量和合并技术。
4.1 工作流设计
输入节点:
- HTTP Request:从招聘网站API获取简历列表
- Google Sheets:读取岗位JD和要求
- PostgreSQL:查询公司人才库数据
处理节点:
- Merge:合并JD和简历数据
- Function:实现匹配度算法
- Filter:筛选合格简历
输出节点:
- Email:发送面试邀请
- Notion:更新候选人跟踪表
4.2 核心代码实现
匹配度算法示例:
const jd = $input.all()[0].json[0]; // 岗位要求 const resumes = $input.all()[1].json; // 简历列表 // 计算匹配分数 const scoredResumes = resumes.map(resume => { let score = 0; // 技能匹配 const matchedSkills = resume.skills.filter(skill => jd.requiredSkills.includes(skill) ); score += matchedSkills.length * 5; // 经验匹配 if (resume.yearsExperience >= jd.minExperience) { score += 20; } // 学历匹配 if (jd.requiredDegree.includes(resume.education)) { score += 15; } return { ...resume, matchScore: score, matchedSkills }; }); // 按分数降序排序 return scoredResumes.sort((a, b) => b.matchScore - a.matchScore);4.3 性能优化技巧
批量处理:对于大量简历,建议分批处理(每批50-100份),避免内存溢出。
缓存机制:使用Workflow变量缓存不变的数据(如JD要求),减少重复计算。
并行处理:对于独立的任务流,可以使用n8n的并行执行功能:
- 右键点击节点连接线
- 选择"Add Branch"
- 配置并行执行路径
日志记录:在关键节点添加日志输出,方便调试:
console.log('Processing resume:', resume.id); $node['当前节点名'].context().data = { progress: `${processed}/${total} resumes processed` };5. 常见问题排查
5.1 变量引用错误
症状:工作流执行失败,报错"Variable not found"。
解决方案:
- 检查节点名称是否完全匹配(包括大小写)
- 确认上游节点已成功执行
- 使用
$input.all()调试数据格式:
return { inputData: $input.all(), nodeNames: Object.keys($node) };5.2 数据合并异常
症状:合并后的数据缺失或重复。
排查步骤:
- 检查Merge节点的模式设置是否正确
- 验证关键字段在各数据源中是否存在且唯一
- 添加调试节点输出合并前数据:
return { input1: $input.all()[0].json, input2: $input.all()[1].json };5.3 Code节点调试技巧
逐步调试法:
- 将复杂逻辑拆分为多个Function节点
- 每个节点只处理一个明确的任务
- 在节点间添加调试输出
错误捕获模板:
try { // 主逻辑代码 return processData($input.all()); } catch (error) { // 返回错误详情便于排查 return { error: error.message, stack: error.stack, inputData: $input.all() }; }- 性能分析:
const start = Date.now(); // ...处理逻辑... const end = Date.now(); return { result: processedData, performance: { processingTime: `${end - start}ms`, itemCount: processedData.length } };