# 基本工作流创建 ## 📚 学习资源 - **图文教程**:[n8n工作流创建完整指南](https://mp.weixin.qq.com/s/oIcmTW0Gg2r63C0Tn91r2Q) - **视频教程**:[从零开始的n8n实战](https://www.bilibili.com/video/BV1nejbz6Eip) - **官方文档**:[n8n Workflow Examples](https://docs.n8n.io/workflows/) 通过本章节,您将学会如何从零开始设计和构建实用的n8n工作流。 ## 🎯 工作流设计原则 ### SOLID原则在工作流中的应用 | 原则 | 工作流应用 | 实践建议 | |------|------------|----------| | **单一职责** | 每个工作流专注一个业务目标 | 避免在一个工作流中处理多个不相关的任务 | | **开放封闭** | 易于扩展,难以修改核心逻辑 | 使用子工作流和模板化设计 | | **里氏替换** | 相似节点可以互相替换 | 标准化节点接口和数据格式 | | **接口隔离** | 最小化节点间依赖 | 只传递必要的数据字段 | | **依赖倒置** | 依赖抽象而非具体实现 | 使用凭证管理而非硬编码 | ### 工作流生命周期 **需求分析** → **流程设计** → **节点配置** → **测试调试** → **部署运行** → **监控维护** → **优化迭代** → 回到流程设计 ## 📝 第一个工作流:每日天气邮件 让我们从一个简单但实用的例子开始学习。 ### 需求分析 **目标**: 每天早上8点自动获取天气信息并发送邮件提醒 **数据源**: OpenWeatherMap API **输出**: HTML格式的天气邮件 **频率**: 每日执行 ### 工作流设计 **Schedule Trigger(每天8:00)** → **HTTP Request(获取天气API)** → **Set Node(处理天气数据)** → **Code Node(生成邮件HTML)** → **Email Send(发送天气邮件)** ### 详细配置步骤 === "1. 定时触发器配置" ```yaml 节点类型: Schedule Trigger 触发规则: Cron Cron表达式: 0 8 * * * 时区: Asia/Shanghai ``` === "2. 天气API请求" ```javascript // HTTP Request 节点配置 { "method": "GET", "url": "https://api.openweathermap.org/data/2.5/weather", "qs": { "q": "Beijing,CN", "appid": "{{$credentials.openweather.api_key}}", "units": "metric", "lang": "zh_cn" } } ``` === "3. 数据处理" ```javascript // Set 节点 - 提取有用信息 { "city": "={{$json.name}}", "temperature": "={{Math.round($json.main.temp)}}", "feels_like": "={{Math.round($json.main.feels_like)}}", "humidity": "={{$json.main.humidity}}", "description": "={{$json.weather[0].description}}", "icon": "={{$json.weather[0].icon}}", "wind_speed": "={{$json.wind.speed}}", "current_time": "={{new Date().toLocaleString('zh-CN', {timeZone: 'Asia/Shanghai'})}}" } ``` === "4. HTML邮件生成" ```javascript // Code 节点 - 生成邮件HTML const weatherData = $input.first().json; const htmlContent = `

🌤️ ${weatherData.city} 今日天气

${weatherData.temperature}°C

${weatherData.description}

体感温度:${weatherData.feels_like}°C

💧${weatherData.humidity}%
湿度
🌬️${weatherData.wind_speed}m/s
风速

更新时间:${weatherData.current_time}
由 n8n 自动发送 ❤️

`; return [{ json: { html_content: htmlContent, subject: `${weatherData.city} ${weatherData.temperature}°C - ${weatherData.description}`, weather_summary: `今日${weatherData.city}气温${weatherData.temperature}°C,${weatherData.description}` } }]; ``` === "5. 邮件发送" ```yaml 节点类型: Email Send 收件人: your-email@example.com 主题: "={{$json.subject}}" 邮件类型: HTML 邮件内容: "={{$json.html_content}}" ``` ## 🔄 进阶工作流:客户反馈处理系统 现在我们来构建一个更复杂的业务工作流。 ### 业务场景 **目标**: 自动化处理客户反馈表单提交 **触发**: 网站表单Webhook **处理**: 分类、存储、分配、通知 **输出**: 多渠道通知和工单创建 ### 工作流架构 **Webhook接收** → **判断反馈类型**: - **投诉** → 高优先级处理 → 发送紧急通知 + 创建高优先级工单 → 发送客户确认 - **建议** → 普通优先级处理 → 存储到数据库 + 分配给客服 → 发送客户确认 - **咨询** → 自动回复处理 → AI自动回复 + 发送确认邮件 → 发送客户确认 ### 核心节点配置 === "Webhook接收" ```javascript // Webhook 节点配置 { "httpMethod": "POST", "path": "customer-feedback", "authentication": "headerAuth", "options": { "rawBody": false } } ``` === "反馈分类逻辑" ```javascript // Switch 节点 - 根据反馈类型分发 const feedbackType = $json.body.feedback_type || 'unknown'; const urgentKeywords = ['投诉', '不满', '退款', '问题', '错误']; const content = $json.body.message || ''; // 检查是否包含紧急关键词 const isUrgent = urgentKeywords.some(keyword => content.includes(keyword) ); if (feedbackType === 'complaint' || isUrgent) { return [0]; // 投诉流程 } else if (feedbackType === 'suggestion') { return [1]; // 建议流程 } else { return [2]; // 咨询流程 } ``` === "数据库存储" ```sql -- PostgreSQL 插入语句 INSERT INTO customer_feedback ( customer_name, customer_email, feedback_type, message, priority, status, created_at, assigned_to ) VALUES ( '{{$json.body.name}}', '{{$json.body.email}}', '{{$json.body.feedback_type}}', '{{$json.body.message}}', '{{$json.priority || "normal"}}', 'new', NOW(), '{{$json.assigned_agent || null}}' ); ``` === "AI自动回复" ```javascript // AI Agent 节点配置 { "model": "gpt-3.5-turbo", "prompt": `你是一个专业的客服助手。客户发来了以下咨询: 客户姓名:{{$json.body.name}} 咨询内容:{{$json.body.message}} 请生成一个专业、友好的自动回复邮件,内容应该: 1. 感谢客户的咨询 2. 确认已收到并会尽快处理 3. 提供预计回复时间 4. 如果是常见问题,提供初步解答 5. 保持礼貌和专业的语调 请以中文回复,格式为邮件正文。`, "temperature": 0.7, "max_tokens": 500 } ``` ## 🔧 工作流最佳实践 ### 错误处理和重试机制 **主流程** → **判断执行成功?**: - **是** → 正常完成 - **否** → Error Trigger → **判断重试次数 < 3?**: - **是** → 等待延迟 → 重新执行 → 回到主流程 - **否** → 发送失败通知 → 记录错误日志 ### 性能优化建议 !!! tip "性能优化技巧" **1. 批量处理** ```javascript // 避免在循环中频繁API调用 // 好的做法:批量收集数据,一次性处理 const batchData = []; for (const item of $input.all()) { batchData.push(item.json); } // 批量API调用 const result = await callBatchAPI(batchData); ``` **2. 缓存机制** ```javascript // 使用Set节点缓存常用数据 const cacheKey = `cache_${$json.query_key}`; const cachedData = $workflow.cache[cacheKey]; if (cachedData && cachedData.timestamp > Date.now() - 3600000) { return cachedData.data; // 使用1小时内的缓存 } ``` **3. 并行执行**:数据输入 → 拆分数据 → 并行处理1/2/3 → 合并结果 ### 测试和调试策略 **1. 单元测试** - 单独测试每个节点 - 使用测试数据验证逻辑 - 检查数据转换正确性 **2. 集成测试** - 端到端流程测试 - 异常情况模拟 - 性能压力测试 **3. 调试技巧** ```javascript // 在Code节点中添加调试信息 console.log('调试信息:', { input_data: $input.all(), processed_count: processedItems.length, timestamp: new Date().toISOString() }); // 使用Set节点添加调试字段 { "debug_info": { "node_name": "数据处理节点", "execution_time": "={{Date.now()}}", "input_size": "={{$input.all().length}}" }, "original_data": "={{$json}}" } ``` ## 📚 工作流模板库 ### 常用业务模板 | 模板类型 | 适用场景 | 核心节点 | |---------|---------|----------| | **数据同步** | CRM、ERP系统集成 | Schedule + HTTP + Database | | **内容管理** | 社交媒体自动发布 | RSS + AI + Social Media APIs | | **监控告警** | 系统监控、业务监控 | HTTP + IF + Email/Slack | | **报告生成** | 定期业务报告 | Database + AI + Email | | **客户服务** | 工单管理、自动回复 | Webhook + AI + Database | ### 学习资源 - **图文教程**: [n8n工作流创建完整指南](https://mp.weixin.qq.com/s/oIcmTW0Gg2r63C0Tn91r2Q) - **视频教程**: [从零开始的n8n实战](https://www.bilibili.com/video/BV1nejbz6Eip) - **官方文档**: [n8n Workflow Examples](https://docs.n8n.io/workflows/) --- 掌握了基本工作流创建后,您就可以开始构建更复杂的自动化解决方案了! [上一章:常用节点](common-nodes/){ .md-button } [下一章:避坑指南](pitfalls/){ .md-button .md-button--primary }