Logon8n中文教程

常见错误处理

N8N 使用过程中的常见错误和解决方案汇总

常见错误处理

在使用 N8N 的过程中,可能会遇到各种错误。本指南汇总了最常见的错误及其解决方案,帮助你快速定位和解决问题。

🚨 连接和认证错误

1. API 连接失败

错误信息

Error: connect ECONNREFUSED 127.0.0.1:3000

常见原因

  • 目标服务未运行
  • 网络连接问题
  • 防火墙阻拦
  • URL 地址错误

解决方案

// 1. 检查服务状态
curl -I https://api.example.com/health

// 2. 使用测试环境
// 先用 Postman 或 curl 测试 API

// 3. 添加错误处理
// 在 HTTP Request 节点中启用
Continue On Fail: true

// 4. 添加重试机制
Retry On Fail: 3
Retry Interval: 2000

2. 认证失败

错误信息

Error: 401 Unauthorized
Error: 403 Forbidden  
Error: Invalid API key

解决方案

// 1. 检查 API Key
console.log('Current API Key:', $env.API_KEY);

// 2. 验证认证格式
// Bearer Token
Authorization: Bearer {{ $env.ACCESS_TOKEN }}

// Basic Auth
Authorization: Basic {{ Buffer.from($env.USERNAME + ':' + $env.PASSWORD).toString('base64') }}

// 3. 检查权限范围
// 确保 API Key 有足够的权限执行操作

// 4. 刷新 Token
// 对于过期的 OAuth Token,添加刷新逻辑

3. SSL/TLS 证书错误

错误信息

Error: self signed certificate
Error: unable to verify the first certificate

解决方案

// 1. 在 HTTP Request 节点中禁用 SSL 验证(仅开发环境)
Ignore SSL Issues: true

// 2. 添加证书验证
// 在服务器部署时添加正确的 SSL 证书

// 3. 使用环境变量控制
{{ $env.NODE_ENV === 'development' ? false : true }}

📊 数据处理错误

1. JSON 解析错误

错误信息

Error: Unexpected token in JSON
Error: Cannot parse JSON

解决方案

// 1. 验证 JSON 格式
try {
  const data = JSON.parse($input.first().json.response);
  return [{ json: data }];
} catch (error) {
  console.log('JSON Parse Error:', error.message);
  console.log('Raw Data:', $input.first().json.response);
  return [{ json: { error: 'Invalid JSON' } }];
}

// 2. 处理空响应
const response = $input.first().json.response;
if (!response || response.trim() === '') {
  return [{ json: { error: 'Empty response' } }];
}

// 3. 清理数据
const cleanedResponse = response
  .replace(/^\uFEFF/, '') // 移除 BOM
  .trim();

2. 数据类型错误

错误信息

Error: Cannot read property 'length' of undefined
Error: $json.items is not a function

解决方案

// 1. 安全访问属性
const items = $json.items || [];
const itemCount = items.length;

// 2. 类型检查
if (Array.isArray($json.items)) {
  $json.items.forEach(item => {
    // 处理数组项
  });
} else {
  console.log('items is not an array:', typeof $json.items);
}

// 3. 使用可选链操作符
const userName = $json.user?.profile?.name || 'Unknown';

// 4. 类型转换
const numericValue = parseInt($json.stringValue) || 0;
const booleanValue = Boolean($json.value);

3. 表达式语法错误

错误信息

Error: Unexpected token
Error: ReferenceError: variable is not defined

解决方案

// ❌ 错误写法
{{ $json.name + "的订单" }}  // 中文字符可能导致问题

// ✅ 正确写法  
{{ $json.name + '的订单' }}   // 使用单引号

// ❌ 错误写法
{{ $json.list.0.name }}       // 数组访问错误

// ✅ 正确写法
{{ $json.list[0].name }}      // 正确的数组访问

// ❌ 错误写法
{{ $json.date > "2024-01-01" }}  // 字符串比较

// ✅ 正确写法
{{ new Date($json.date) > new Date("2024-01-01") }}

🔄 工作流执行错误

1. 内存溢出

错误信息

Error: JavaScript heap out of memory
Error: Maximum call stack size exceeded

解决方案

// 1. 分批处理大数据
const batchSize = 100;
const items = $input.all();

for (let i = 0; i < items.length; i += batchSize) {
  const batch = items.slice(i, i + batchSize);
  // 处理批次数据
  await processBatch(batch);
}

// 2. 清理不需要的数据
return items.map(item => ({
  json: {
    // 只保留必要字段
    id: item.json.id,
    name: item.json.name
    // 移除大型数据字段
  }
}));

// 3. 使用流式处理
// 对于大文件,使用流式读取而不是一次性加载

2. 超时错误

错误信息

Error: Timeout
Error: Request timeout

解决方案

// 1. 增加超时时间
// 在 HTTP Request 节点中设置
timeout: 30000  // 30秒

// 2. 异步处理
// 将长时间任务分解为多个步骤

// 3. 使用 Webhook 回调
// 对于长时间运行的任务,使用异步模式
{
  "taskId": "12345",
  "callbackUrl": "https://your-n8n.com/webhook/task-complete"
}

3. 循环依赖

错误信息

Error: Circular dependency detected
Error: Maximum execution depth reached

解决方案

// 1. 检查工作流连接
// 确保没有形成循环连接

// 2. 添加循环计数器
let loopCount = $node["Function"].getWorkflowStaticData('node').loopCount || 0;
loopCount++;

if (loopCount > 100) {
  throw new Error('Maximum loop count reached');
}

$node["Function"].getWorkflowStaticData('node').loopCount = loopCount;

// 3. 使用条件退出
if ($json.shouldStop || $json.iteration > 10) {
  return [];  // 停止执行
}

🗄️ 数据库错误

1. 连接失败

错误信息

Error: connect ECONNREFUSED
Error: Access denied for user
Error: Database does not exist

解决方案

// 1. 检查连接参数
const config = {
  host: $env.DB_HOST,
  port: $env.DB_PORT || 3306,
  database: $env.DB_NAME,
  user: $env.DB_USER,
  password: $env.DB_PASSWORD
};

// 2. 测试连接
// 使用简单查询测试连接
SELECT 1 as test;

// 3. 检查防火墙和网络
// 确保数据库端口对 N8N 开放

// 4. 验证凭据
// 在数据库中直接验证用户名密码

2. SQL 语法错误

错误信息

Error: You have an error in your SQL syntax
Error: Column 'xxx' doesn't exist

解决方案

-- 1. 使用参数化查询
SELECT * FROM users WHERE id = {{ $json.userId }};

-- 2. 处理特殊字符
SELECT * FROM users WHERE name = '{{ $json.name.replace(/'/g, "''") }}';

-- 3. 验证字段存在
-- 在执行前检查表结构
DESCRIBE users;

-- 4. 使用安全的字段引用
SELECT `user_id`, `user_name` FROM `users`;

3. 数据类型不匹配

错误信息

Error: Data truncated
Error: Incorrect integer value

解决方案

// 1. 数据类型转换
const userId = parseInt($json.userId) || 0;
const amount = parseFloat($json.amount) || 0.0;
const isActive = Boolean($json.isActive);

// 2. 数据验证
if (isNaN(userId) || userId <= 0) {
  throw new Error('Invalid user ID');
}

// 3. 使用适当的数据类型
INSERT INTO orders (user_id, amount, order_date) 
VALUES (
  {{ parseInt($json.userId) }},
  {{ parseFloat($json.amount) }},
  '{{ new Date($json.orderDate).toISOString().slice(0, 19).replace('T', ' ') }}'
);

🔒 权限和安全错误

1. 文件权限错误

错误信息

Error: EACCES: permission denied
Error: ENOENT: no such file or directory

解决方案

# 1. 检查文件权限
ls -la /path/to/file

# 2. 修改权限
chmod 644 /path/to/file
chown n8n:n8n /path/to/file

# 3. 创建目录
mkdir -p /path/to/directory

2. 环境变量未设置

错误信息

Error: Environment variable 'API_KEY' is not set
Error: $env.API_KEY is undefined

解决方案

// 1. 检查环境变量
const apiKey = $env.API_KEY;
if (!apiKey) {
  throw new Error('API_KEY environment variable is required');
}

// 2. 提供默认值
const apiUrl = $env.API_URL || 'https://api.example.com';

// 3. 验证关键变量
const requiredVars = ['API_KEY', 'DATABASE_URL', 'WEBHOOK_SECRET'];
requiredVars.forEach(varName => {
  if (!process.env[varName]) {
    throw new Error(`${varName} environment variable is required`);
  }
});

🛠️ 调试技巧

1. 使用日志输出

// 在 Function 节点中添加详细日志
console.log('Input data:', JSON.stringify($input.all(), null, 2));
console.log('Processing step 1 completed');
console.log('Final result:', result);

// 使用条件日志
if ($env.NODE_ENV === 'development') {
  console.log('Debug info:', debugData);
}

2. 数据检查

// 检查数据结构
const data = $input.first().json;
console.log('Data type:', typeof data);
console.log('Data keys:', Object.keys(data));
console.log('Array length:', Array.isArray(data.items) ? data.items.length : 'Not an array');

// 验证必需字段
const requiredFields = ['id', 'email', 'name'];
const missingFields = requiredFields.filter(field => !data[field]);
if (missingFields.length > 0) {
  throw new Error(`Missing required fields: ${missingFields.join(', ')}`);
}

3. 错误恢复

// 实现错误恢复逻辑
try {
  // 尝试主要逻辑
  const result = await mainProcess(data);
  return [{ json: result }];
} catch (error) {
  console.log('Main process failed:', error.message);
  
  // 尝试备用方案
  try {
    const fallbackResult = await fallbackProcess(data);
    return [{ json: { ...fallbackResult, warning: 'Used fallback method' } }];
  } catch (fallbackError) {
    // 记录错误并返回最小响应
    console.log('Fallback also failed:', fallbackError.message);
    return [{ json: { error: true, message: 'All processing methods failed' } }];
  }
}

📋 错误预防清单

开发阶段

  • 验证所有 API 端点和认证
  • 测试边界条件和异常数据
  • 添加适当的错误处理
  • 使用环境变量管理配置
  • 实现数据验证逻辑

部署阶段

  • 检查生产环境配置
  • 验证网络连接和防火墙
  • 设置监控和告警
  • 准备错误恢复流程
  • 测试备份和恢复机制

运行阶段

  • 定期检查日志
  • 监控性能指标
  • 及时更新依赖
  • 备份重要数据
  • 制定故障响应计划

通过系统性地了解和预防这些常见错误,你可以构建更稳定、更可靠的 N8N 工作流。记住,错误是学习和改进的机会!