n8n入门教程系列目录
【n8n入门教程01】n8n工作流自动化平台架构解析与核心概念详解
【n8n入门教程02】macOS安装n8n保姆级教程-Homebrew与npm两种方式详解
【n8n入门教程03】n8n变量配置与多输入数据合并完整指南
【n8n入门教程04】n8n权限与路径管理全指南:避免常见错误,保障数据安全
【n8n入门教程05】n8n Workflow编辑器完全指南:从入门到精通
【n8n入门教程06】n8n常用节点完全指南:从文件操作到代码执行
【n8n入门教程08】n8n触发节点完全指南:定时器、Webhook和手动触发
【n8n入门教程09】n8n Code与Execute Command节点深度对比与最佳实践
【n8n入门教程10】n8n本地程序集成完全指南:使用Execute Command节点
【n8n入门教程11】n8n大模型集成完全指南:调用OpenAI和Gemini API
【n8n入门教程12】n8n PDF翻译自动化实战:从英文PDF到中文PDF
在 n8n 中有两个经常被混淆的节点:Code 节点和 Execute Command 节点。虽然它们都能执行自定义逻辑,但实现原理、适用场景和限制完全不同。今天就来详细对比这两个节点,帮你快速选择合适的方式,避免踩坑。
概要与实现差异
先来说说这两个节点最核心的区别:
Code 节点:
- 在 n8n 进程内部运行
- 支持 JavaScript 和 Python(Beta)
- 运行在受控的沙箱环境
- 无法访问宿主机文件系统和网络
- 适合数据处理和轻量逻辑
Execute Command 节点:
- 在宿主机或容器内运行 Shell 命令
- 可以调用任何系统工具
- 有完整的系统访问权限
- 仅在自托管环境可用
- 适合调用系统工具和脚本
Code 节点原理与适用场景
Code 节点是在 n8n 进程内部启动一个受控的运行环境来执行自定义代码。默认使用 JavaScript,从 n8n 1.0 版开始增加了 Python 支持。
Python 实现方式
这里要特别说明一下:Code 节点的 Python 不是通过系统的 Python 可执行文件实现,而是通过 Pyodide 将 CPython 编译为 WebAssembly。这意味着:
- 只能使用随 Pyodide 发布的部分 Python 库
- 首次调用时 n8n 会自动下载依赖
- 性能明显慢于 JavaScript
- 不适合重度数据科学或机器学习任务
执行模式
Code 节点支持两种执行模式:
Run Once for All Items(默认):
- 工作流运行时,代码只执行一次
- 无论输入有多少条数据
- 适合批量处理
Run Once for Each Item:
- 对每条输入数据单独运行代码
- 每条数据都会执行一次代码
- 适合需要单独处理每条数据的场景
可用库与模块限制
JavaScript 模式下,Code 节点支持返回 Promise,可使用 console.log 输出调试信息。n8n 提供了 $node、$json 等内置变量和方法。
模块限制:
- 外部模块需通过环境变量显式允许
- 自托管环境可以设置
NODE_FUNCTION_ALLOW_EXTERNAL和NODE_FUNCTION_ALLOW_BUILTIN - n8n Cloud 环境无法安装外部模块,只提供
crypto和moment两个可用模块
配置示例:
# 允许使用 crypto 和 fs 两个内置模块export NODE_FUNCTION_ALLOW_BUILTIN=crypto,fs
# 允许加载 moment 和 lodash 两个外部模块export NODE_FUNCTION_ALLOW_EXTERNAL=moment,lodashCode 节点的使用场景
Code 节点适合在工作流内部快速编写逻辑,尤其是结构化数据转换和轻量算法:
-
数据转换和清洗
- 解析 JSON
- 重构字段
- 合并数组
- 数据格式转换
-
复杂条件逻辑
- 当 If/Set 等节点组合无法满足需求时
- 可以用完整的编程语言表达复杂条件
-
调用受限的内置函数
- 利用
crypto进行哈希或签名 - 用
moment格式化时间
- 利用
-
自定义算法与验证
- 对输入数据做校验
- 计算统计结果
- 生成随机值
对于短耗时任务建议优先使用 Code 节点,因为其运行在 n8n 的进程内,延迟和开销较低。
技术限制与注意事项
Code 节点存在以下限制:
-
沙箱环境
- Code 节点内部运行的代码受限于 vm2 沙箱
- 无法访问宿主机的文件系统和网络
- 应该通过 n8n 的专用节点来实现这些功能
-
模块限制
- 外部模块需通过环境变量显式允许
- n8n Cloud 中无法安装自定义模块
- 只能使用官方提供的
crypto和moment
-
性能和阻塞问题
- Code 节点的运行与 n8n 的主进程共享事件循环
- 长时间的同步计算可能阻塞整个服务
- 编写代码时应避免使用耗时的循环或大型计算
-
Python 的限制
- 使用 Pyodide,代码执行速度较慢
- 只能使用有限的包
- 不适合重度数据科学或机器学习任务
-
数据项与链接
- 如果输入和输出的数据项数量不一致
- 需要在代码中处理 Item linking
- 否则下游节点可能接收到不匹配的数据
Execute Command 节点原理与适用场景
Execute Command 节点允许在运行 n8n 的宿主机上执行任何 Shell 命令。命令在宿主机的默认 Shell 中运行,比如 Windows 上的 cmd 或 macOS 的 zsh。
重要提示:
- 如果 n8n 以 Docker 部署,命令运行在 n8n 容器中,而不是宿主操作系统
- 此节点在 n8n Cloud 不可用
节点参数
Execute Command 节点有两个常用参数:
Execute Once:
- 控制是为输入的所有数据执行一次命令
- 还是每条数据执行一次
Command:
- 编写要执行的 Shell 命令
- 可以通过
&&串联多条命令 - 或换行写在不同行
Execute Command 节点的使用场景
Execute Command 节点非常适合需要调用系统工具或已经存在的脚本的场景:
-
运行本地脚本或程序
- 执行 Bash/Python/PowerShell 脚本
- 调用如
ffmpeg、imagemagick、pandoc等命令行工具
-
系统管理任务
- 文件操作
- 进程管理
- 系统监控
-
处理大文件
- 视频转码
- 图片处理
- 文档转换
-
使用本地依赖
- 调用系统安装的 Python 库
- 使用本地编译的程序
- 访问本地数据库
Execute Command 节点的限制
-
平台限制
- 仅在自托管环境可用
- n8n Cloud 不支持
-
安全风险
- 可以执行任意系统命令
- 需要谨慎使用,避免安全漏洞
- 多用户环境下要限制权限
-
环境依赖
- 依赖宿主机或容器中安装的工具
- 需要提前配置好环境
- Docker 部署需要自定义镜像
-
输出限制
- 输出有大小限制
- 可能遇到 “stdout maxBuffer length exceeded” 错误
- 需要减少输出量或使用管道过滤
在 n8n 中调用本地环境的实践
Docker 环境配置
如果在 Docker 环境下缺少某些命令,可通过自定义 Dockerfile 扩展镜像:
FROM docker.n8n.io/n8nio/n8nUSER rootRUN apk --update add curlUSER node常见问题处理
命令未找到:
- 检查命令拼写及系统 PATH 配置
- 使用
docker container exec <container_ID> <command>检查容器内命令可用性
输出超限:
- 减少命令输出量
- 使用管道过滤输出
- 将结果写入文件再读取
安全隔离:
- 自托管用户可通过环境变量排除高风险节点
- 提升 Execute Command 节点的使用权限管理
常见坑与规避建议
-
不要在 Code 节点中尝试文件操作
- Code 节点在沙箱中运行,无法访问文件系统
- 应该使用 Read/Write Files 节点
-
不要在 Code 节点中调用网络请求
- 应该使用 HTTP Request 节点
- Code 节点无法访问网络
-
避免在 Code 节点中执行耗时操作
- 会阻塞 n8n 主进程
- 影响整个系统的性能
- 长时间任务应该用 Execute Command 节点
-
Execute Command 节点要注意命令注入
- 不要直接拼接外部输入到命令字符串
- 建议使用参数化或严格校验
-
Python Code 节点性能较差
- 优先使用 JavaScript
- 真需要 Python 时考虑用 Execute Command 调用系统 Python
示例
Code 节点示例(JavaScript)
// 访问输入数据const items = $input.all();
// 处理数据const processed = items.map(item => { const data = item.json; return { json: { id: data.id, processed: true, timestamp: new Date().toISOString() } };});
// 返回处理后的数据return processed;Execute Command 节点示例
# 运行 Python 脚本python /path/to/script.py --input "{{ $json.data }}"
# 使用 ffmpeg 转换视频ffmpeg -i "{{ $json.inputFile }}" -vf "scale=1280:720" "{{ $json.outputFile }}"
# 调用系统工具pdftotext "{{ $json.pdfPath }}" -总结与建议
选择建议
优先使用 Code 节点的情况:
- 数据转换和清洗
- 复杂条件逻辑
- 轻量算法实现
- 快速原型开发
使用 Execute Command 节点的情况:
- 需要调用系统工具
- 处理大文件
- 使用本地依赖
- 需要完整的系统权限
最佳实践
-
性能优先
- 能用 Code 节点就用 Code 节点
- JavaScript 性能优于 Python
-
安全第一
- Execute Command 节点要谨慎使用
- 做好权限管理
- 避免命令注入
-
合理分工
- Code 节点处理业务逻辑
- Execute Command 节点处理系统操作
- HTTP Request 节点处理网络请求
-
充分测试
- 在测试环境验证所有功能
- 检查性能和安全性
- 做好错误处理
记住:Code 节点适合数据处理,Execute Command 节点适合系统集成。合理选择,才能发挥 n8n 的最大威力。