n8n-validation-expert by czlonkowski/n8n-skills
npx skills add https://github.com/czlonkowski/n8n-skills --skill n8n-validation-expert解读和修复 n8n 验证错误的专家指南。
尽早验证,经常验证
验证通常是迭代进行的:
关键见解:验证是一个迭代过程,而非一蹴而就!
阻止工作流执行 - 必须在激活前解决
类型:
missing_required - 未提供必填字段invalid_value - 值不匹配允许的选项type_mismatch - 错误的数据类型(例如字符串代替数字)invalid_reference - 引用的节点不存在invalid_expression - 表达式语法错误广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
示例:
{
"type": "missing_required",
"property": "channel",
"message": "Channel name is required",
"fix": "Provide a channel name (lowercase, no spaces, 1-80 characters)"
}
不阻止执行 - 工作流可以激活,但可能存在潜在问题
类型:
best_practice - 推荐但非必需deprecated - 使用了旧的 API/功能performance - 潜在的性能问题示例:
{
"type": "best_practice",
"property": "errorHandling",
"message": "Slack API can have rate limits",
"suggestion": "Add onError: 'continueRegularOutput' with retryOnFail"
}
锦上添花 - 可以增强工作流的改进项
类型:
optimization - 可以更高效alternative - 实现相同结果的更好方式7,841 次 出现此模式:
1. Configure node
↓
2. validate_node (23 seconds thinking about errors)
↓
3. Read error messages carefully
↓
4. Fix errors
↓
5. validate_node again (58 seconds fixing)
↓
6. Repeat until valid (usually 2-3 iterations)
// Iteration 1
let config = {
resource: "channel",
operation: "create"
};
const result1 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Error: Missing "name"
// ⏱️ 23 seconds thinking...
// Iteration 2
config.name = "general";
const result2 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Error: Missing "text"
// ⏱️ 58 seconds fixing...
// Iteration 3
config.text = "Hello!";
const result3 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Valid! ✅
这是正常的! 不要因为多次迭代而气馁。
根据你的阶段选择合适的配置文件:
使用时机:编辑期间的快速检查
验证内容:
优点:最快,最宽松 缺点:可能遗漏问题
使用时机:部署前验证
验证内容:
优点:平衡,能捕获真实错误 缺点:可能遗漏一些边缘情况
这是大多数用例的推荐配置文件
使用时机:AI 生成的配置
验证内容:
优点:对 AI 工作流干扰较少 缺点:可能允许一些有问题的配置
使用时机:生产部署,关键工作流
验证内容:
优点:最大安全性 缺点:许多警告,可能存在误报
含义:未提供必填字段
如何修复:
get_node 查看必填字段示例:
// Error
{
"type": "missing_required",
"property": "channel",
"message": "Channel name is required"
}
// Fix
config.channel = "#general";
含义:值不匹配允许的选项
如何修复:
get_node 查看选项示例:
// Error
{
"type": "invalid_value",
"property": "operation",
"message": "Operation must be one of: post, update, delete",
"current": "send"
}
// Fix
config.operation = "post"; // Use valid operation
含义:字段的数据类型错误
如何修复:
示例:
// Error
{
"type": "type_mismatch",
"property": "limit",
"message": "Expected number, got string",
"current": "100"
}
// Fix
config.limit = 100; // Number, not string
含义:表达式语法错误
如何修复:
{{}} 或有拼写错误示例:
// Error
{
"type": "invalid_expression",
"property": "text",
"message": "Invalid expression: $json.name",
"current": "$json.name"
}
// Fix
config.text = "={{$json.name}}"; // Add {{}}
含义:引用的节点不存在
如何修复:
示例:
// 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_workflown8n_update_partial_workflow运算符:equals, notEquals, contains, notContains, greaterThan, lessThan, startsWith, endsWith
修复:移除 singleValue 属性(二元运算符比较两个值)
修复前:
{
"type": "boolean",
"operation": "equals",
"singleValue": true // ❌ Wrong!
}
修复后(自动):
{
"type": "boolean",
"operation": "equals"
// singleValue removed ✅
}
运算符:isEmpty, isNotEmpty, true, false
修复:添加 singleValue: true(一元运算符检查单个值)
修复前:
{
"type": "boolean",
"operation": "isEmpty"
// Missing singleValue ❌
}
修复后(自动):
{
"type": "boolean",
"operation": "isEmpty",
"singleValue": true // ✅ Added
}
修复:为 IF v2.2+ 和 Switch v3.2+ 添加完整的 conditions.options 元数据
引用不存在的节点
解决方案:在 n8n_update_partial_workflow 中使用 cleanStaleConnections 操作
3 个 Switch 规则但只有 2 个输出连接
解决方案:添加缺失的连接或移除多余的规则
API 返回损坏的数据但拒绝更新
解决方案:可能需要手动数据库干预
技术上“错误”但在你的用例中可以接受的验证警告
警告:未配置错误处理
何时可接受:
何时修复:处理重要数据的生产工作流
警告:节点在失败时不重试
何时可接受:
何时修复:不稳定的外部服务,生产自动化
警告:API 调用没有速率限制
何时可接受:
何时修复:公共 API,高流量工作流
警告:SELECT 语句没有 LIMIT
何时可接受:
何时修复:对大表的生产查询
使用 ai-friendly 配置文件:
validate_node({
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
}
}
valid 字段if (result.valid) {
// ✅ Configuration is valid
} else {
// ❌ Has errors - must fix before deployment
}
result.errors.forEach(error => {
console.log(`Error in ${error.property}: ${error.message}`);
console.log(`Fix: ${error.fix}`);
});
result.warnings.forEach(warning => {
console.log(`Warning: ${warning.message}`);
console.log(`Suggestion: ${warning.suggestion}`);
// Decide if you need to address this
});
// Optional improvements
// Not required but may enhance workflow
验证整个工作流,而不仅仅是单个节点
检查内容:
示例:
validate_workflow({
workflow: {
nodes: [...],
connections: {...}
},
options: {
validateNodes: true,
validateConnections: true,
validateExpressions: true,
profile: "runtime"
}
})
{
"error": "Connection from 'Transform' to 'NonExistent' - target node not found"
}
修复:移除过时的连接或创建缺失的节点
{
"error": "Circular dependency detected: Node A → Node B → Node A"
}
修复:重构工作流以移除循环
{
"warning": "Multiple trigger nodes found - only one will execute"
}
修复:移除多余的触发器或拆分为独立的工作流
{
"warning": "Node 'Transform' is not connected to workflow flow"
}
修复:连接节点,如果未使用则移除
时机:配置严重损坏
步骤:
get_node 记录必填字段时机:工作流验证通过但执行不正确
步骤:
时机:出现“节点未找到”错误
步骤:
n8n_update_partial_workflow({
id: "workflow-id",
operations: [{
type: "cleanStaleConnections"
}]
})
时机:运算符结构错误
步骤:
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_nodestrict 配置文件(干扰太多)有关全面的错误目录和误报示例:
关键点:
验证流程:
相关技能:
每周安装量
998
仓库
GitHub 星标
3.4K
首次出现
Jan 20, 2026
安全审计
安装于
opencode854
gemini-cli826
codex799
github-copilot722
cursor671
claude-code670
Expert guide for interpreting and fixing n8n validation errors.
Validate early, validate often
Validation is typically iterative:
Key insight : Validation is an iterative process, not one-shot!
Blocks workflow execution - Must be resolved before activation
Types :
missing_required - Required field not providedinvalid_value - Value doesn't match allowed optionstype_mismatch - Wrong data type (string instead of number)invalid_reference - Referenced node doesn't existinvalid_expression - Expression syntax errorExample :
{
"type": "missing_required",
"property": "channel",
"message": "Channel name is required",
"fix": "Provide a channel name (lowercase, no spaces, 1-80 characters)"
}
Doesn't block execution - Workflow can be activated but may have issues
Types :
best_practice - Recommended but not requireddeprecated - Using old API/featureperformance - Potential performance issueExample :
{
"type": "best_practice",
"property": "errorHandling",
"message": "Slack API can have rate limits",
"suggestion": "Add onError: 'continueRegularOutput' with retryOnFail"
}
Nice to have - Improvements that could enhance workflow
Types :
optimization - Could be more efficientalternative - Better way to achieve same result7,841 occurrences of this pattern:
1. Configure node
↓
2. validate_node (23 seconds thinking about errors)
↓
3. Read error messages carefully
↓
4. Fix errors
↓
5. validate_node again (58 seconds fixing)
↓
6. Repeat until valid (usually 2-3 iterations)
// Iteration 1
let config = {
resource: "channel",
operation: "create"
};
const result1 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Error: Missing "name"
// ⏱️ 23 seconds thinking...
// Iteration 2
config.name = "general";
const result2 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Error: Missing "text"
// ⏱️ 58 seconds fixing...
// Iteration 3
config.text = "Hello!";
const result3 = validate_node({
nodeType: "nodes-base.slack",
config,
profile: "runtime"
});
// → Valid! ✅
This is normal! Don't be discouraged by multiple iterations.
Choose the right profile for your stage:
Use when : Quick checks during editing
Validates :
Pros : Fastest, most permissive Cons : May miss issues
Use when : Pre-deployment validation
Validates :
Pros : Balanced, catches real errors Cons : Some edge cases missed
This is the recommended profile for most use cases
Use when : AI-generated configurations
Validates :
Pros : Less noisy for AI workflows Cons : May allow some questionable configs
Use when : Production deployment, critical workflows
Validates :
Pros : Maximum safety Cons : Many warnings, some false positives
What it means : A required field is not provided
How to fix :
get_node to see required fieldsExample :
// Error
{
"type": "missing_required",
"property": "channel",
"message": "Channel name is required"
}
// Fix
config.channel = "#general";
What it means : Value doesn't match allowed options
How to fix :
get_node to see optionsExample :
// Error
{
"type": "invalid_value",
"property": "operation",
"message": "Operation must be one of: post, update, delete",
"current": "send"
}
// Fix
config.operation = "post"; // Use valid operation
What it means : Wrong data type for field
How to fix :
Example :
// Error
{
"type": "type_mismatch",
"property": "limit",
"message": "Expected number, got string",
"current": "100"
}
// Fix
config.limit = 100; // Number, not string
What it means : Expression syntax error
How to fix :
{{}} or typosExample :
// Error
{
"type": "invalid_expression",
"property": "text",
"message": "Invalid expression: $json.name",
"current": "$json.name"
}
// Fix
config.text = "={{$json.name}}"; // Add {{}}
What it means : Referenced node doesn't exist
How to fix :
Example :
// 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}}";
Automatically fixes common operator structure issues on ANY workflow update
Runs when :
n8n_create_workflown8n_update_partial_workflowOperators : equals, notEquals, contains, notContains, greaterThan, lessThan, startsWith, endsWith
Fix : Removes singleValue property (binary operators compare two values)
Before :
{
"type": "boolean",
"operation": "equals",
"singleValue": true // ❌ Wrong!
}
After (automatic):
{
"type": "boolean",
"operation": "equals"
// singleValue removed ✅
}
Operators : isEmpty, isNotEmpty, true, false
Fix : Adds singleValue: true (unary operators check single value)
Before :
{
"type": "boolean",
"operation": "isEmpty"
// Missing singleValue ❌
}
After (automatic):
{
"type": "boolean",
"operation": "isEmpty",
"singleValue": true // ✅ Added
}
Fix : Adds complete conditions.options metadata for IF v2.2+ and Switch v3.2+
References to non-existent nodes
Solution : Use cleanStaleConnections operation in n8n_update_partial_workflow
3 Switch rules but only 2 output connections
Solution : Add missing connections or remove extra rules
API returns corrupt data but rejects updates
Solution : May require manual database intervention
Validation warnings that are technically "wrong" but acceptable in your use case
Warning : No error handling configured
When acceptable :
When to fix : Production workflows handling important data
Warning : Node doesn't retry on failure
When acceptable :
When to fix : Flaky external services, production automation
Warning : No rate limiting for API calls
When acceptable :
When to fix : Public APIs, high-volume workflows
Warning : SELECT without LIMIT
When acceptable :
When to fix : Production queries on large tables
Useai-friendly profile:
validate_node({
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
}
}
valid fieldif (result.valid) {
// ✅ Configuration is valid
} else {
// ❌ Has errors - must fix before deployment
}
result.errors.forEach(error => {
console.log(`Error in ${error.property}: ${error.message}`);
console.log(`Fix: ${error.fix}`);
});
result.warnings.forEach(warning => {
console.log(`Warning: ${warning.message}`);
console.log(`Suggestion: ${warning.suggestion}`);
// Decide if you need to address this
});
// Optional improvements
// Not required but may enhance workflow
Validates entire workflow , not just individual nodes
Checks :
Example :
validate_workflow({
workflow: {
nodes: [...],
connections: {...}
},
options: {
validateNodes: true,
validateConnections: true,
validateExpressions: true,
profile: "runtime"
}
})
{
"error": "Connection from 'Transform' to 'NonExistent' - target node not found"
}
Fix : Remove stale connection or create missing node
{
"error": "Circular dependency detected: Node A → Node B → Node A"
}
Fix : Restructure workflow to remove loop
{
"warning": "Multiple trigger nodes found - only one will execute"
}
Fix : Remove extra triggers or split into separate workflows
{
"warning": "Node 'Transform' is not connected to workflow flow"
}
Fix : Connect node or remove if unused
When : Configuration is severely broken
Steps :
get_nodeWhen : Workflow validates but executes incorrectly
Steps :
When : "Node not found" errors
Steps :
n8n_update_partial_workflow({
id: "workflow-id",
operations: [{
type: "cleanStaleConnections"
}]
})
When : Operator structure errors
Steps :
n8n_autofix_workflow({
id: "workflow-id",
applyFixes: false // Preview first
})
// Review fixes, then apply
n8n_autofix_workflow({
id: "workflow-id",
applyFixes: true
})
runtime profile for pre-deploymentvalid field before assuming successget_node when unclear about requirementsstrict profile during development (too noisy)For comprehensive error catalogs and false positive examples:
Key Points :
Validation Process :
Related Skills :
Weekly Installs
998
Repository
GitHub Stars
3.4K
First Seen
Jan 20, 2026
Security Audits
Gen Agent Trust HubFailSocketPassSnykPass
Installed on
opencode854
gemini-cli826
codex799
github-copilot722
cursor671
claude-code670
99,500 周安装