npx skills add https://github.com/vladm3105/aidoc-flow-framework --skill n8n为在 n8n 自动化平台上开发工作流、自定义节点和集成提供专业指导。使 AI 助手能够设计工作流、编写自定义代码节点、构建基于 TypeScript 的自定义节点、集成外部服务以及实现 AI 代理模式。
在以下情况下调用此技能:
请勿在以下情况下使用此技能:
运行时环境:
工作流执行模型:
公平代码许可证:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
核心节点(数据操作):
触发器节点(工作流启动):
操作节点(500+ 集成):
AI 节点(LangChain 集成):
连接类型:
数据结构:
// 所有节点的输入/输出格式
[
{
json: { /* 您的数据对象 */ },
binary: { /* 可选的二进制数据(文件、图像) */ },
pairedItem: { /* 对源项目的引用 */ }
}
]
数据访问模式:
{{ $json.field }}(当前节点输出){{ $('NodeName').item.json.field }}(特定节点){{ $input.all() }}(整个数据集){{ $input.first() }}(单个项目){{ $itemIndex }}(当前迭代)凭据类型:
安全实践:
步骤 1:定义需求
步骤 2:映射数据流
步骤 3:选择节点
决策标准:
工作流结构模式:
[触发器] → [验证] → [分支(如果/切换)] → [处理] → [错误处理器]
↓ ↓
[路径 A 节点] [路径 B 节点]
↓ ↓
[合并/输出] [输出]
模块化设计:
错误处理策略:
本地测试:
生产验证:
可用 API:
fs、path、crypto、https_.groupBy()、_.sortBy() 等$input、$json、$binary基本结构:
// 访问输入项目
const items = $input.all();
// 处理数据
const processedItems = items.map(item => {
const inputData = item.json;
return {
json: {
// 输出字段
processed: inputData.field.toUpperCase(),
timestamp: new Date().toISOString()
}
};
});
// 返回转换后的项目
return processedItems;
数据转换模式:
过滤:
const items = $input.all();
return items.filter(item => item.json.status === 'active');
聚合:
const items = $input.all();
const grouped = _.groupBy(items, item => item.json.category);
return [{
json: {
summary: Object.keys(grouped).map(category => ({
category,
count: grouped[category].length
}))
}
}];
API 调用(异步):
const items = $input.all();
const results = [];
for (const item of items) {
const response = await fetch(`https://api.example.com/data/${item.json.id}`);
const data = await response.json();
results.push({
json: {
original: item.json,
enriched: data
}
});
}
return results;
代码中的错误处理:
const items = $input.all();
return items.map(item => {
try {
// 有风险的操作
const result = JSON.parse(item.json.data);
return { json: { parsed: result } };
} catch (error) {
return {
json: {
error: error.message,
original: item.json.data
}
};
}
});
可用库:
json、datetime、re、requests基本结构:
# 访问输入项目
items = _input.all()
# 处理数据
processed_items = []
for item in items:
input_data = item['json']
processed_items.append({
'json': {
'processed': input_data['field'].upper(),
'timestamp': datetime.now().isoformat()
}
})
# 返回转换后的项目
return processed_items
复杂度评级:代码节点
在以下情况下构建自定义节点:
在以下情况下使用代码节点:
[查看代码示例:examples/n8n_custom_node.ts]
1. 编程风格(完全控制)
适用于:
[查看:examples/n8n_custom_node.ts 中的 CustomNode 类]
2. 声明式风格(简化)
适用于:
[查看:examples/n8n_custom_node.ts 中的 operations 和 router 导出]
其他示例:
customApiCredentialsvalidateCredentials()PollingTrigger 类步骤 1:初始化节点
# 从模板创建
npm create @n8n/node my-custom-node
# 创建的目录结构:
# ├── nodes/
# │ └── MyCustomNode/
# │ └── MyCustomNode.node.ts
# ├── credentials/
# │ └── MyCustomNodeApi.credentials.ts
# └── package.json
步骤 2:实现逻辑
步骤 3:构建和测试
# 构建 TypeScript
npm run build
# 本地链接以进行测试
npm link
# 在 n8n 开发环境中
cd ~/.n8n/nodes
npm link my-custom-node
# 重启 n8n 以加载节点
n8n start
步骤 4:发布
# 社区节点(npm 包)
npm publish
# 在 n8n 中安装
设置 → 社区节点 → 安装 → 输入包名称
复杂度评级:自定义节点
决策树:
有原生节点? ──是──> 使用原生节点
│
否
├──> 简单的 REST API? ──是──> HTTP 请求节点
├──> 复杂身份验证(OAuth2)? ──是──> 构建自定义节点
├──> 跨工作流可重用? ──是──> 构建自定义节点
└──> 一次性集成? ──是──> 使用 fetch() 的代码节点
带查询参数的 GET:
URL: https://api.example.com/users
方法: GET
查询参数:
- status: active
- limit: 100
身份验证: 头部认证
- 名称: Authorization
- 值: Bearer {{$credentials.apiKey}}
带 JSON 请求体的 POST:
URL: https://api.example.com/users
方法: POST
请求体内容类型: JSON
请求体:
{
"name": "={{ $json.name }}",
"email": "={{ $json.email }}"
}
分页处理(代码节点):
let allResults = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const response = await this.helpers.request({
method: 'GET',
url: `https://api.example.com/data?page=${page}`,
json: true,
});
allResults = allResults.concat(response.results);
hasMore = response.hasNext;
page++;
}
return allResults.map(item => ({ json: item }));
接收 webhook:
响应 webhook:
// 在 webhook 触发器后的代码节点中
const webhookData = $input.first().json;
// 处理数据
const result = processData(webhookData);
// 返回响应(同步 webhook)
return [{
json: {
status: 'success',
data: result
}
}];
Webhook URL 结构:
生产环境: https://your-domain.com/webhook/workflow-id
测试环境: https://your-domain.com/webhook-test/workflow-id
常见模式:
带参数的查询:
-- PostgreSQL 节点
SELECT * FROM users
WHERE created_at > $1
AND status = $2
ORDER BY created_at DESC
-- 来自前一个节点的参数
参数: ['{{ $json.startDate }}', 'active']
批量插入:
// 为数据库准备数据的代码节点
const items = $input.all();
const values = items.map(item => ({
name: item.json.name,
email: item.json.email,
created_at: new Date().toISOString()
}));
return [{ json: { values } }];
// 下一个节点: PostgreSQL
// INSERT INTO users (name, email, created_at)
// VALUES {{ $json.values }}
上传到 S3:
工作流: 文件触发器 → S3 上传
- 文件触发器: 监控目录中的新文件
- S3 节点:
- 操作: 上传
- 存储桶: my-bucket
- 文件名: {{ $json.fileName }}
- 二进制数据: true(来自文件触发器)
下载和处理:
HTTP 请求(下载) → 代码(处理) → Google Drive(上传)
- HTTP 请求: 启用二进制响应
- 代码: 处理 $binary.data
- Google Drive: 使用二进制数据上传
AI 代理节点配置:
基本代理模式:
手动触发器 → AI 代理 → 输出
- AI 代理:
- 提示: "You are a helpful assistant that {{$json.task}}"
- 工具: [Calculator, HTTP Request]
- 记忆: Conversation Buffer Window
使用场景: 代理操作前需要人工批准
Webhook → AI 代理 → 如果(需要批准) → 发送电子邮件 → 等待 Webhook → 执行操作
↓(自动批准)
执行操作
实现:
使用场景: 带状态的多步骤问题解决
循环开始 → AI 代理 → 工具执行 → 状态更新 → 循环结束(条件检查)
↑______________________________________________________________|
状态管理:
// 代码节点 - 初始化状态
return [{
json: {
task: 'Research topic',
iteration: 0,
maxIterations: 5,
context: [],
completed: false
}
}];
// 代码节点 - 更新状态
const state = $json;
state.iteration++;
state.context.push($('AI Agent').item.json.response);
state.completed = state.iteration >= state.maxIterations || checkGoalMet(state);
return [{ json: state }];
查询输入 → 向量存储搜索 → 格式化上下文 → LLM → 响应输出
向量存储设置:
复杂度评级:AI 工作流
[查看代码示例:examples/n8n_deployment.yaml]
Docker(推荐):
[查看:examples/n8n_deployment.yaml 中的 docker-compose 配置]
npm(开发):
npm install n8n -g
n8n start
# 访问: http://localhost:5678
环境配置:
[查看:examples/n8n_deployment.yaml 中的完整环境变量参考]
基本变量:
N8N_HOST - Webhook 的公共 URLWEBHOOK_URL - Webhook 端点基础N8N_ENCRYPTION_KEY - 凭据加密(必须持久化)DB_TYPE - 数据库(SQLite/PostgreSQL/MySQL/MariaDB)EXECUTIONS_DATA_SAVE_ON_ERROR - 错误日志记录EXECUTIONS_DATA_SAVE_ON_SUCCESS - 成功日志记录性能调优变量记录在 examples/n8n_deployment.yaml 中
队列模式(高容量):
# 分离主进程和工作进程
# 主进程(UI + 队列管理)
N8N_QUEUE_MODE=main n8n start
# 工作进程(仅执行)
N8N_QUEUE_MODE=worker n8n worker
数据库:
资源要求:
| 工作流容量 | CPU | 内存 | 数据库 |
|---|---|---|---|
| <100 次执行/天 | 1 核 | 512MB | SQLite |
| 100-1000/天 | 2 核 | 2GB | PostgreSQL |
| 1000-10000/天 | 4 核 | 4GB | PostgreSQL |
10000/天 | 8+ 核 | 8GB+ | PostgreSQL + 队列模式
监控:
1. 模块化:
2. 错误恢复能力:
3. 性能:
4. 安全性:
5. 可维护性:
1. 数据验证:
// 始终验证输入结构
const items = $input.all();
for (const item of items) {
if (!item.json.email || !item.json.name) {
throw new Error(`Invalid input: missing required fields at item ${item.json.id}`);
}
}
2. 错误上下文:
// 提供调试信息
try {
const result = await apiCall(item.json.id);
} catch (error) {
throw new Error(`API call failed for ID ${item.json.id}: ${error.message}`);
}
3. 幂等性:
// 创建前检查是否存在
const exists = await checkExists(item.json.uniqueId);
if (!exists) {
await createRecord(item.json);
}
使用场景: 在两个系统之间同步数据
计划触发器(每小时) → 获取源数据 → 转换 → 如果(记录存在) → 更新目标
↓(新)
在目标中创建
复杂度: 2
使用场景: 使用指数退避重试失败的操作
主工作流 → 处理 → 错误 → 错误触发器工作流
↓
等待(延迟) → 重试 → 如果(最大重试次数) → 警报
复杂度: 3
使用场景: 使用外部源增强数据
Webhook → 分批拆分 → 对于每个项目:
↓
API 调用(增强) → 代码(合并) → 批量结果
↓
数据库插入
复杂度: 3
使用场景: 处理来自消息队列的事件
SQS 触发器 → 解析消息 → 切换(事件类型) → [处理器 A, 处理器 B, 处理器 C] → 确认/删除消息
复杂度: 3
使用场景: 审批工作流
触发器 → 生成请求 → 发送电子邮件(批准链接) → Webhook(批准响应) → 如果(已批准) → 执行操作
↓(已拒绝)
发送拒绝通知
复杂度: 4
使用场景: 复杂的数据管道
计划 → 提取(API) → 验证 → 转换 → 加载(数据库) → 成功通知
↓ ↓
错误处理器 ────────────────────> 错误通知
复杂度: 3
当满足以下条件时,工作流已准备好投入生产:
功能:
错误处理:
安全性:
文档:
性能:
当满足以下条件时,自定义节点已准备好投入生产:
功能:
代码质量:
文档:
分发:
问题:工作流失败,提示"无效的 JSON"
原因: 节点输出格式不正确
解决方案:
// 确保返回格式正确
return [{ json: { your: 'data' } }];
// 不要:return { your: 'data' };
问题:"无法读取未定义的属性"
原因: 前一个节点缺少数据
解决方案:
// 访问前检查是否存在
const value = $json.field?.subfield ?? 'default';
问题:Webhook 未接收到数据
验证 URL 是否与外部服务配置匹配
检查身份验证方法是否匹配(无/头部/基本)
使用 curl 测试:
curl -X POST https://your-n8n.com/webhook/test \
-H "Content-Type: application/json" \
-d '{"test": "data"}'
问题:自定义节点未出现
原因: 未正确链接/安装
解决方案:
# 检查安装
npm list -g | grep n8n-nodes-
# 如果需要,重新安装
npm install -g n8n-nodes-your-node
# 重启 n8n
问题:内存使用率高
问题:凭据不工作
1. 检查节点输出:
2. 添加调试代码节点:
// 记录中间值
const data = $json;
console.log('调试数据:', JSON.stringify(data, null, 2));
return [{ json: data }];
3. 使用如果节点进行验证:
// 检查数据质量的表达式
{{ $json.email && $json.email.includes('@') }}
4. 启用执行日志记录:
docker logs n8n -f5. 隔离测试:
cloud-devops-expert 技能database-specialist 技能api-design-architect 技能版本: 1.0.0 最后更新: 2025-11-13 复杂度评级: 3(中等 - 需要平台特定知识) 预计学习时间: 8-12 小时达到熟练程度
每周安装次数
317
仓库
GitHub 星标数
9
首次出现
2026年1月22日
安全审计
安装于
opencode281
gemini-cli274
codex266
github-copilot256
cursor255
kimi-cli231
Provide specialized guidance for developing workflows, custom nodes, and integrations on the n8n automation platform. Enable AI assistants to design workflows, write custom code nodes, build TypeScript-based custom nodes, integrate external services, and implement AI agent patterns.
Invoke this skill when:
Do NOT use this skill for:
Runtime Environment:
Workflow Execution Models:
Fair-code License:
Core Nodes (Data manipulation):
Trigger Nodes (Workflow initiation):
Action Nodes (500+ integrations):
AI Nodes (LangChain integration):
Connection Types:
Data Structure:
// Input/output format for all nodes
[
{
json: { /* Your data object */ },
binary: { /* Optional binary data (files, images) */ },
pairedItem: { /* Reference to source item */ }
}
]
Data Access Patterns:
{{ $json.field }} (current node output){{ $('NodeName').item.json.field }} (specific node){{ $input.all() }} (entire dataset){{ $input.first() }} (single item){{ $itemIndex }} (current iteration)Credential Types:
Security Practices:
Step 1: Define Requirements
Step 2: Map Data Flow
Step 3: Select Nodes
Decision criteria:
Workflow Structure Pattern:
[Trigger] → [Validation] → [Branch (If/Switch)] → [Processing] → [Error Handler]
↓ ↓
[Path A nodes] [Path B nodes]
↓ ↓
[Merge/Output] [Output]
Modular Design:
Error Handling Strategy:
Local Testing:
Production Validation:
Available APIs:
fs, path, crypto, https_.groupBy(), _.sortBy(), etc.$input, $json, $binaryBasic Structure:
// Access input items
const items = $input.all();
// Process data
const processedItems = items.map(item => {
const inputData = item.json;
return {
json: {
// Output fields
processed: inputData.field.toUpperCase(),
timestamp: new Date().toISOString()
}
};
});
// Return transformed items
return processedItems;
Data Transformation Patterns:
Filtering:
const items = $input.all();
return items.filter(item => item.json.status === 'active');
Aggregation:
const items = $input.all();
const grouped = _.groupBy(items, item => item.json.category);
return [{
json: {
summary: Object.keys(grouped).map(category => ({
category,
count: grouped[category].length
}))
}
}];
API calls (async):
const items = $input.all();
const results = [];
for (const item of items) {
const response = await fetch(`https://api.example.com/data/${item.json.id}`);
const data = await response.json();
results.push({
json: {
original: item.json,
enriched: data
}
});
}
return results;
Error Handling in Code:
const items = $input.all();
return items.map(item => {
try {
// Risky operation
const result = JSON.parse(item.json.data);
return { json: { parsed: result } };
} catch (error) {
return {
json: {
error: error.message,
original: item.json.data
}
};
}
});
Available Libraries:
json, datetime, re, requestsBasic Structure:
# Access input items
items = _input.all()
# Process data
processed_items = []
for item in items:
input_data = item['json']
processed_items.append({
'json': {
'processed': input_data['field'].upper(),
'timestamp': datetime.now().isoformat()
}
})
# Return transformed items
return processed_items
Complexity Rating: Code Nodes
Build custom node when:
Use Code node when:
[See Code Examples: examples/n8n_custom_node.ts]
1. Programmatic Style (Full control)
Use for:
[See: CustomNode class in examples/n8n_custom_node.ts]
2. Declarative Style (Simplified)
Use for:
[See: operations and router exports in examples/n8n_custom_node.ts]
Additional Examples:
customApiCredentials in examples/n8n_custom_node.tsvalidateCredentials() in examples/n8n_custom_node.tsPollingTrigger class in examples/n8n_custom_node.tsStep 1: Initialize Node
# Create from template
npm create @n8n/node my-custom-node
# Directory structure created:
# ├── nodes/
# │ └── MyCustomNode/
# │ └── MyCustomNode.node.ts
# ├── credentials/
# │ └── MyCustomNodeApi.credentials.ts
# └── package.json
Step 2: Implement Logic
Step 3: Build and Test
# Build TypeScript
npm run build
# Link locally for testing
npm link
# In n8n development environment
cd ~/.n8n/nodes
npm link my-custom-node
# Restart n8n to load node
n8n start
Step 4: Publish
# Community node (npm package)
npm publish
# Install in n8n
Settings → Community Nodes → Install → Enter package name
Complexity Rating: Custom Nodes
Decision Tree:
Has native node? ──Yes──> Use native node
│
No
├──> Simple REST API? ──Yes──> HTTP Request node
├──> Complex auth (OAuth2)? ──Yes──> Build custom node
├──> Reusable across workflows? ──Yes──> Build custom node
└──> One-off integration? ──Yes──> Code node with fetch()
GET with query parameters:
URL: https://api.example.com/users
Method: GET
Query Parameters:
- status: active
- limit: 100
Authentication: Header Auth
- Name: Authorization
- Value: Bearer {{$credentials.apiKey}}
POST with JSON body:
URL: https://api.example.com/users
Method: POST
Body Content Type: JSON
Body:
{
"name": "={{ $json.name }}",
"email": "={{ $json.email }}"
}
Pagination handling (Code node):
let allResults = [];
let page = 1;
let hasMore = true;
while (hasMore) {
const response = await this.helpers.request({
method: 'GET',
url: `https://api.example.com/data?page=${page}`,
json: true,
});
allResults = allResults.concat(response.results);
hasMore = response.hasNext;
page++;
}
return allResults.map(item => ({ json: item }));
Receiving webhooks:
Responding to webhooks:
// In Code node after webhook trigger
const webhookData = $input.first().json;
// Process data
const result = processData(webhookData);
// Return response (synchronous webhook)
return [{
json: {
status: 'success',
data: result
}
}];
Webhook URL structure:
Production: https://your-domain.com/webhook/workflow-id
Test: https://your-domain.com/webhook-test/workflow-id
Common patterns:
Query with parameters:
-- PostgreSQL node
SELECT * FROM users
WHERE created_at > $1
AND status = $2
ORDER BY created_at DESC
-- Parameters from previous node
Parameters: ['{{ $json.startDate }}', 'active']
Batch insert:
// Code node preparing data for database
const items = $input.all();
const values = items.map(item => ({
name: item.json.name,
email: item.json.email,
created_at: new Date().toISOString()
}));
return [{ json: { values } }];
// Next node: PostgreSQL
// INSERT INTO users (name, email, created_at)
// VALUES {{ $json.values }}
Upload to S3:
Workflow: File Trigger → S3 Upload
- File Trigger: Monitor directory for new files
- S3 node:
- Operation: Upload
- Bucket: my-bucket
- File Name: {{ $json.fileName }}
- Binary Data: true (from file trigger)
Download and process:
HTTP Request (download) → Code (process) → Google Drive (upload)
- HTTP Request: Binary response enabled
- Code: Process $binary.data
- Google Drive: Upload with binary data
AI Agent Node Configuration:
Basic Agent Pattern:
Manual Trigger → AI Agent → Output
- AI Agent:
- Prompt: "You are a helpful assistant that {{$json.task}}"
- Tools: [Calculator, HTTP Request]
- Memory: Conversation Buffer Window
Use case: Human approval before agent actions
Webhook → AI Agent → If (requires approval) → Send Email → Wait for Webhook → Execute Action
↓ (auto-approve)
Execute Action
Implementation:
Use case: Multi-step problem solving with state
Loop Start → AI Agent → Tool Execution → State Update → Loop End (condition check)
↑______________________________________________________________|
State management:
// Code node - Initialize state
return [{
json: {
task: 'Research topic',
iteration: 0,
maxIterations: 5,
context: [],
completed: false
}
}];
// Code node - Update state
const state = $json;
state.iteration++;
state.context.push($('AI Agent').item.json.response);
state.completed = state.iteration >= state.maxIterations || checkGoalMet(state);
return [{ json: state }];
Query Input → Vector Store Search → Format Context → LLM → Response Output
Vector Store setup:
Complexity Rating: AI Workflows
[See Code Examples: examples/n8n_deployment.yaml]
Docker (Recommended):
[See: docker-compose configurations in examples/n8n_deployment.yaml]
npm (Development):
npm install n8n -g
n8n start
# Access: http://localhost:5678
Environment Configuration:
[See: Complete environment variable reference in examples/n8n_deployment.yaml]
Essential variables:
N8N_HOST - Public URL for webhooksWEBHOOK_URL - Webhook endpoint baseN8N_ENCRYPTION_KEY - Credential encryption (must persist)DB_TYPE - Database (SQLite/PostgreSQL/MySQL/MariaDB)EXECUTIONS_DATA_SAVE_ON_ERROR - Error loggingEXECUTIONS_DATA_SAVE_ON_SUCCESS - Success loggingPerformance tuning variables documented in examples/n8n_deployment.yaml
Queue Mode (High volume):
# Separate main and worker processes
# Main process (UI + queue management)
N8N_QUEUE_MODE=main n8n start
# Worker processes (execution only)
N8N_QUEUE_MODE=worker n8n worker
Database:
Resource Requirements:
| Workflow Volume | CPU | RAM | Database |
|---|---|---|---|
| <100 exec/day | 1 core | 512MB | SQLite |
| 100-1000/day | 2 cores | 2GB | PostgreSQL |
| 1000-10000/day | 4 cores | 4GB | PostgreSQL |
10000/day | 8+ cores | 8GB+ | PostgreSQL + Queue mode
Monitoring:
1. Modularity:
2. Error Resilience:
3. Performance:
4. Security:
5. Maintainability:
1. Data validation:
// Always validate input structure
const items = $input.all();
for (const item of items) {
if (!item.json.email || !item.json.name) {
throw new Error(`Invalid input: missing required fields at item ${item.json.id}`);
}
}
2. Error context:
// Provide debugging information
try {
const result = await apiCall(item.json.id);
} catch (error) {
throw new Error(`API call failed for ID ${item.json.id}: ${error.message}`);
}
3. Idempotency:
// Check existence before creation
const exists = await checkExists(item.json.uniqueId);
if (!exists) {
await createRecord(item.json);
}
Use case: Sync data between two systems
Schedule Trigger (hourly) → Fetch Source Data → Transform → If (record exists) → Update Target
↓ (new)
Create in Target
Complexity: 2
Use case: Retry failed operations with exponential backoff
Main Workflow → Process → Error → Error Trigger Workflow
↓
Wait (delay) → Retry → If (max retries) → Alert
Complexity: 3
Use case: Augment data with external sources
Webhook → Split In Batches → For Each Item:
↓
API Call (enrich) → Code (merge) → Batch Results
↓
Database Insert
Complexity: 3
Use case: Process events from message queue
SQS Trigger → Parse Message → Switch (event type) → [Handler A, Handler B, Handler C] → Confirm/Delete Message
Complexity: 3
Use case: Approval workflow
Trigger → Generate Request → Send Email (approval link) → Webhook (approval response) → If (approved) → Execute Action
↓ (rejected)
Send Rejection Notice
Complexity: 4
Use case: Complex data pipeline
Schedule → Extract (API) → Validate → Transform → Load (Database) → Success Notification
↓ ↓
Error Handler ────────────────────> Error Notification
Complexity: 3
A workflow is production-ready when:
Functionality:
Error Handling:
Security:
Documentation:
Performance:
A custom node is production-ready when:
Functionality:
Code Quality:
Documentation:
Distribution:
Issue: Workflow fails with "Invalid JSON"
Cause: Node output not in correct format
Resolution:
// Ensure return format
return [{ json: { your: 'data' } }];
// NOT: return { your: 'data' };
Issue: "Cannot read property of undefined"
Cause: Missing data from previous node
Resolution:
// Check existence before access
const value = $json.field?.subfield ?? 'default';
Issue: Webhook not receiving data
Verify URL matches external service configuration
Check authentication method matches (None/Header/Basic)
Test with curl:
curl -X POST https://your-n8n.com/webhook/test \
-H "Content-Type: application/json" \
-d '{"test": "data"}'
Issue: Custom node not appearing
Cause: Not properly linked/installed
Resolution:
# Check installation
npm list -g | grep n8n-nodes-
# Reinstall if needed
npm install -g n8n-nodes-your-node
# Restart n8n
Issue: High memory usage
Issue: Credentials not working
1. Inspect node output:
2. Add debug Code nodes:
// Log intermediate values
const data = $json;
console.log('Debug data:', JSON.stringify(data, null, 2));
return [{ json: data }];
3. Use If node for validation:
// Expression to check data quality
{{ $json.email && $json.email.includes('@') }}
4. Enable execution logging:
docker logs n8n -f5. Test in isolation:
cloud-devops-expert skilldatabase-specialist skillapi-design-architect skillVersion: 1.0.0 Last Updated: 2025-11-13 Complexity Rating: 3 (Moderate - requires platform-specific knowledge) Estimated Learning Time: 8-12 hours for proficiency
Weekly Installs
317
Repository
GitHub Stars
9
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykWarn
Installed on
opencode281
gemini-cli274
codex266
github-copilot256
cursor255
kimi-cli231
Skills CLI 使用指南:AI Agent 技能包管理器安装与管理教程
19,000 周安装