mcpField
N
n8n-validation-expert

n8n-validation-expert

github.com/ovachiever测试与质量5650 次安装48 周前更新
代码仓库

关于 n8n-validation-expert

n8n-validation-expert 是帮助理解和修复 n8n 验证问题的技能,面向配置和维护工作流的用户。它介绍错误分级、验证配置和工作流的方法,以及自动修复的适用范围。

主要功能

  1. 01区分错误、警告与建议
  2. 02说明四种验证配置档
  3. 03提供常见错误的排查步骤
  4. 04解释工作流结构验证
  5. 05说明自动清理与修复限制

适用场景

  1. 01部署前检查工作流配置
  2. 02排查无效字段和表达式
  3. 03识别断开的节点引用
  4. 04判断验证警告是否可接受

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ovachiever/droid-tings --skill n8n-validation-expert

安装后在 Claude Code 中输入/n8n-validation-expert确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

ERROR_CATALOG.md
FALSE_POSITIVES.md
README.md

详细介绍

n8n 验证专家

解读和修复 n8n 验证错误的专家指南。


验证理念

尽早验证,频繁验证

验证通常是一个迭代过程:

  • 预期会有多轮验证反馈
  • 通常需要 2-3 轮“验证 → 修复”
  • 平均需要 23s 思考错误、58s 修复错误

关键要点:验证是一个迭代过程,而非一次性操作!


错误严重级别

1. 错误(必须修复)

会阻止工作流执行——必须在激活前解决

类型:

  • missing_required - 未提供必填字段
  • invalid_value - 值与允许的选项不匹配
  • type_mismatch - 数据类型错误(例如应为数字,却提供了字符串)
  • invalid_reference - 引用的节点不存在
  • invalid_expression - 表达式语法错误

示例:

{
  "type": "missing_required",
  "property": "channel",
  "message": "Channel name is required",
  "fix": "Provide a channel name (lowercase, no spaces, 1-80 characters)"
}
2. 警告(应该修复)

不会阻止执行——可以激活工作流,但可能存在问题

类型:

  • best_practice - 建议采用,但并非必需
  • deprecated - 使用了旧版 API/功能
  • performance - 可能存在性能问题

示例:

{
  "type": "best_practice",
  "property": "errorHandling",
  "message": "Slack API can have rate limits",
  "suggestion": "Add onError: 'continueRegularOutput' with retryOnFail"
}
3. 建议(可选)

锦上添花——可通过改进提升工作流

类型:

  • optimization - 可以更高效
  • alternative - 有更好的方法可以实现相同结果

验证循环

遥测数据中的模式

7,841 次出现此模式:

1. Configure node
   ↓
2. validate_node_operation (23 seconds thinking about errors)
   ↓
3. Read error messages carefully
   ↓
4. Fix errors
   ↓
5. validate_node_operation again (58 seconds fixing)
   ↓
6. Repeat until valid (usually 2-3 iterations)
示例
// Iteration 1
let config = {
  resource: "channel",
  operation: "create"
};

const result1 = validate_node_operation({
  nodeType: "nodes-base.slack",
  config,
  profile: "runtime"
});
// → Error: Missing "name"

// ⏱️  23 seconds thinking...

// Iteration 2
config.name = "general";

const result2 = validate_node_operation({
  nodeType: "nodes-base.slack",
  config,
  profile: "runtime"
});
// → Error: Missing "text"

// ⏱️  58 seconds fixing...

// Iteration 3
config.text = "Hello!";

const result3 = validate_node_operation({
  nodeType: "nodes-base.slack",
  config,
  profile: "runtime"
});
// → Valid! ✅

这是正常的! 多次迭代时不必气馁。


验证配置

根据所处阶段选择合适的配置:

minimal

使用场景:编辑期间快速检查

验证内容:

  • 仅检查必填字段
  • 基本结构

优点:速度最快,限制最少 缺点:可能会遗漏问题

runtime(推荐)

使用场景:部署前验证

验证内容:

  • 必填字段
  • 值类型
  • 允许的值
  • 基本依赖项

优点:平衡性好,可发现实际错误 缺点:可能会遗漏某些边缘情况

此配置适用于大多数使用场景

ai-friendly

使用场景:AI 生成的配置

验证内容:

  • 与 runtime 相同
  • 减少误报
  • 对轻微问题更宽容

优点:减少 AI 工作流中的干扰 缺点:可能会放行一些值得商榷的配置

strict

使用场景:生产部署、关键工作流

验证内容:

  • 所有内容
  • 最佳实践
  • 性能问题
  • 安全问题

优点:安全性最高 缺点:警告较多,也可能出现误报


常见错误类型

1. missing_required

含义:未提供必填字段

修复方法:

  1. 使用 get_node_essentials 查看必填字段
  2. 将缺失字段添加到配置中
  3. 提供合适的值

示例:

// Error
{
  "type": "missing_required",
  "property": "channel",
  "message": "Channel name is required"
}

// Fix
config.channel = "#general";
2. invalid_value

含义:值与允许的选项不匹配

修复方法:

  1. 查看错误消息中的允许值
  2. 使用 get_node_essentials 查看选项
  3. 更新为有效值

示例:

// Error
{
  "type": "invalid_value",
  "property": "operation",
  "message": "Operation must be one of: post, update, delete",
  "current": "send"
}

// Fix
config.operation = "post";  // Use valid operation
3. type_mismatch

含义:字段的数据类型错误

修复方法:

  1. 查看错误消息中的预期类型
  2. 将值转换为正确的类型

示例:

// Error
{
  "type": "type_mismatch",
  "property": "limit",
  "message": "Expected number, got string",
  "current": "100"
}

// Fix
config.limit = 100;  // Number, not string
4. invalid_expression

含义:表达式语法错误

修复方法:

  1. 使用 n8n 表达式语法技能
  2. 检查是否缺少 {{}} 或存在拼写错误
  3. 验证节点/字段引用

示例:

// Error
{
  "type": "invalid_expression",
  "property": "text",
  "message": "Invalid expression: $json.name",
  "current": "$json.name"
}

// Fix
config.text = "={{$json.name}}";  // Add {{}}
5. invalid_reference

含义:引用的节点不存在

修复方法:

  1. 检查节点名称拼写
  2. 确认节点存在于工作流中
  3. 将引用更新为正确的名称

示例:

// Error
{
  "type": "invalid_reference",
  "property": "expression",
  "message": "Node 'HTTP Requets' does not exist",
  "current": "={{$node['HTTP Requets'].json.data}}"
}

// Fix - correct typo
config.expression = "={{$node['HTTP Request'].json.data}}";

自动清理系统

功能说明

自动修复任何工作流更新中的常见操作符结构问题

运行时机:

  • n8n_create_workflow
  • n8n_update_partial_workflow
  • 任何工作流保存操作
修复内容
1. 二元运算符(两个值)

运算符:equals、notEquals、contains、notContains、greaterThan、lessThan、startsWith、endsWith

修复:移除 singleValue 属性(二元运算符比较两个值)

修复前:

{
  "type": "boolean",
  "operation": "equals",
  "singleValue": true  // ❌ Wrong!
}

修复后(自动):

{
  "type": "boolean",
  "operation": "equals"
  // singleValue removed ✅
}
2. 一元运算符(一个值)

运算符:isEmpty、isNotEmpty、true、false

修复:添加 singleValue: true(一元运算符检查单个值)

修复前:

{
  "type": "boolean",
  "operation": "isEmpty"
  // Missing singleValue ❌
}

修复后(自动):

{
  "type": "boolean",
  "operation": "isEmpty",
  "singleValue": true  // ✅ Added
}
3. IF/Switch 元数据

修复:为 IF v2.2+ 和 Switch v3.2+ 添加完整的 conditions.options 元数据

无法修复的内容
1. 连接损坏

引用了不存在的节点

解决方案:在 n8n_update_partial_workflow 中使用 cleanStaleConnections 操作

2. 分支数量不匹配

有 3 条 Switch 规则,但只有 2 个输出连接

解决方案:添加缺少的连接或移除多余的规则

3. 矛盾的损坏状态

API 返回损坏的数据,但拒绝更新

解决方案:可能需要手动干预数据库


误报

什么是误报?

在技术上“错误”,但在你的使用场景中可以接受的验证警告

常见误报
1. “缺少错误处理”

警告:未配置错误处理

可接受的情况:

  • 失败情况显而易见的简单工作流
  • 测试/开发工作流
  • 非关键通知

应修复的情况:处理重要数据的生产工作流

2. “没有重试逻辑”

警告:节点失败时不会重试

可接受的情况:

  • 自带重试逻辑的 API
  • 幂等操作
  • 手动触发的工作流

应修复的情况:不稳定的外部服务、生产自动化

3. “缺少速率限制”

警告:API 调用没有速率限制

可接受的情况:

  • 没有限制的内部 API
  • 低流量工作流
  • 在服务端实施速率限制的 API

应修复的情况:公共 API、高流量工作流

4. “无界查询”

警告:SELECT 未使用 LIMIT

可接受的情况:

  • 已知的小型数据集
  • 聚合查询
  • 开发/测试

应修复的情况:针对大型表的生产查询

减少误报

使用 ai-friendly 配置文件:

validate_node_operation({
  nodeType: "nodes-base.slack",
  config: {...},
  profile: "ai-friendly"  // Fewer false positives
})

验证结果结构

完整响应
{
  "valid": false,
  "errors": [
    {
      "type": "missing_required",
      "property": "channel",
      "message": "Channel name is required",
      "fix": "Provide a channel name (lowercase, no spaces)"
    }
  ],
  "warnings": [
    {
      "type": "best_practice",
      "property": "errorHandling",
      "message": "Slack API can have rate limits",
      "suggestion": "Add onError: 'continueRegularOutput'"
    }
  ],
  "suggestions": [
    {
      "type": "optimization",
      "message": "Consider using batch operations for multiple messages"
    }
  ],
  "summary": {
    "hasErrors": true,
    "errorCount": 1,
    "warningCount": 1,
    "suggestionCount": 1
  }
}
如何阅读
1. 检查 valid 字段
if (result.valid) {
  // ✅ Configuration is valid
} else {
  // ❌ Has errors - must fix before deployment
}
2. 优先修复错误
result.errors.forEach(error => {
  console.log(`Error in ${error.property}: ${error.message}`);
  console.log(`Fix: ${error.fix}`);
});
3. 查看警告
result.warnings.forEach(warning => {
  console.log(`Warning: ${warning.message}`);
  console.log(`Suggestion: ${warning.suggestion}`);
  // Decide if you need to address this
});
4. 考虑建议
// Optional improvements
// Not required but may enhance workflow

工作流验证

validate_workflow(结构)

验证整个工作流,而不仅是单个节点

检查项:

  1. 节点配置——每个节点都有效
  2. 连接——没有失效的引用
  3. 表达式——语法和引用均有效
  4. 流程——工作流逻辑结构

示例:

validate_workflow({
  workflow: {
    nodes: [...],
    connections: {...}
  },
  options: {
    validateNodes: true,
    validateConnections: true,
    validateExpressions: true,
    profile: "runtime"
  }
})
常见工作流错误
1. 连接损坏
{
  "error": "Connection from 'Transform' to 'NonExistent' - target node not found"
}

修复:移除过时的连接或创建缺少的节点

2. 循环依赖
{
  "error": "Circular dependency detected: Node A → Node B → Node A"
}

修复:重构工作流以消除循环

3. 多个起始节点
{
  "warning": "Multiple trigger nodes found - only one will execute"
}

修复:移除多余的触发器或拆分为单独的工作流

4. 未连接的节点
{
  "warning": "Node 'Transform' is not connected to workflow flow"
}

修复:连接节点,或在不使用时将其移除


恢复策略

策略 1:从头开始

适用情况:配置严重损坏

步骤:

  1. 从 get_node_essentials 中记录必填字段
  2. 创建最精简的有效配置
  3. 逐步添加功能
  4. 每次添加后都进行验证
策略 2:二分搜索

适用情况:工作流验证通过,但执行不正确

步骤:

  1. 移除一半节点
  2. 验证并测试
  3. 如果正常:问题在已移除的节点中
  4. 如果失败:问题在剩余节点中
  5. 重复以上步骤,直到隔离出问题
策略 3:清理过时连接

适用情况:“找不到节点”错误

步骤:

n8n_update_partial_workflow({
  id: "workflow-id",
  operations: [{
    type: "cleanStaleConnections"
  }]
})
策略 4:使用自动修复

适用情况:运算符结构错误

步骤:

n8n_autofix_workflow({
  id: "workflow-id",
  applyFixes: false  // Preview first
})

// Review fixes, then apply
n8n_autofix_workflow({
  id: "workflow-id",
  applyFixes: true
})

最佳实践

✅ 应做
  • 每次进行重大更改后都要验证
  • 完整阅读错误消息
  • 逐个修复错误(一次一个)
  • 部署前使用 runtime 配置
  • 确认成功前检查 valid 字段
  • 对于运算符问题,相信自动清理的结果
  • 不确定要求时,使用 get_node_essentials
  • 记录你接受的误报
❌ 不应做
  • 激活前跳过验证
  • 试图一次性修复所有错误
  • 忽略错误消息
  • 开发期间使用 strict 配置(噪声太多)
  • 假设验证已通过(始终检查结果)
  • 手动修复自动清理问题
  • 带着未解决的错误部署
  • 忽略所有警告(有些警告很重要!)

详细指南

有关完整的错误目录和误报示例:


总结

要点:

  1. 验证是迭代过程(平均 2-3 轮,23 秒 + 58 秒)
  2. 必须修复错误,警告可酌情处理
  3. 自动清理会自动修复运算符结构
  4. 使用 runtime 配置进行平衡验证
  5. 存在误报——要学会识别
  6. 阅读错误消息——其中包含修复指导

验证流程:

  1. 验证 → 阅读错误 → 修复 → 再次验证
  2. 重复直到验证通过(通常需要 2-3 次迭代)
  3. 检查警告并判断是否可以接受
  4. 放心部署

相关技能:

  • n8n MCP Tools Expert - 正确使用验证工具
  • n8n Expression Syntax - 修复表达式错误
  • n8n Node Configuration - 了解必填字段

评论

支持 Markdown