场景导入:为什么你需要开发自定义节点?
作为 N8N大学 的主编,我见过太多小伙伴在用 n8n 时遇到“拦路虎”:市面上的 500 多个节点虽然强大,但总有那么几个特定的业务逻辑,比如对接内部的老旧 ERP 系统,或者调用一个冷门的 API,n8n 官方并没有提供现成的节点。
这时候,难道要放弃自动化吗?当然不。自定义节点(Custom Node)就是 n8n 赋予你的终极武器。它能让你把任何 JavaScript/TypeScript 的逻辑封装成一个标准的 n8n 节点,像搭积木一样嵌入你的工作流中。
今天,笔者就带你从最简单的 “Hello World” 开始,硬核实战,手把手教你开发、调试,并最终将你的节点发布到 n8n 社区节点商店,让全球开发者都能用上你的作品。
准备工作:磨刀不误砍柴工
在开始写代码之前,我们需要准备好开发环境。别担心,门槛很低,只需要你有一台电脑和基础的终端操作能力。
硬性条件清单:
- Node.js (v14.18+ 或 v16.0+):这是运行 JavaScript 的环境,必须安装。
- npm:Node.js 自带的包管理工具,用于安装依赖。
- n8n 实例:本地运行的 n8n 环境(用于测试)或云端的 n8n 账号。
- 代码编辑器:推荐 VS Code,轻量且插件丰富。
如果你还没有安装 Node.js,请先去官网下载安装。安装完成后,在终端输入 node -v 和 npm -v 检查版本,确保它们都已正确安装。
核心实操:搭建你的第一个自定义节点
n8n 官方提供了一个非常方便的脚手架工具,我们不需要从零配置 Webpack 或 Babel,直接使用官方模板即可。以下是四个核心步骤:
步骤一:使用脚手架初始化项目
打开你的终端,进入你想存放项目的文件夹,运行以下命令:
npx n8n-nodes-base init my-custom-node
这里的 my-custom-node 是你的项目名称,你可以随意修改。脚手架会自动创建一个包含基础结构的文件夹,并安装必要的依赖。这一步能帮你省去繁琐的配置时间。
步骤二:解析节点核心代码结构
进入项目目录,找到 nodes/MyCustomNode/MyCustomNode.node.ts 文件。这是节点的“心脏”。我们需要关注以下几个核心部分:
- interface:定义节点的元数据,比如名称、图标、描述等。这决定了节点在 n8n 侧边栏显示的样子。
- execute:这是节点运行时的逻辑核心。所有的数据处理、API 调用都在这里进行。
- fields:定义节点的 UI 界面,即用户在画布上双击节点后看到的输入框、下拉菜单等配置项。
虽然官方模板里有示例代码,但我们要理解它的运行机制:n8n 会将上一个节点的数据传递过来,经过 execute 函数处理后,再传递给下一个节点。
步骤三:手写 “Hello World” 逻辑
现在,让我们修改代码,实现一个简单的功能:接收输入数据,并在最后拼接一句 “Hello World”。
打开 MyCustomNode.node.ts,找到 execute 方法。将其修改为如下逻辑(保留原有的结构,只修改核心部分):
async execute(this: IExecuteFunctions) {
const items = this.getInputData();
let item: INodeExecutionData;
// 遍历所有输入项
for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
item = items[itemIndex];
// 获取输入数据的 JSON 部分
let jsonProperties = item.json;
// 在这里添加我们的逻辑
jsonProperties.message = "Hello World from N8N University!";
// 将处理后的数据返回
items[itemIndex] = { json: jsonProperties };
}
return [items];
}
这段代码逻辑非常清晰:获取输入 -> 遍历处理 -> 添加新字段 -> 返回结果。这就是 n8n 节点处理数据的通用范式。
步骤四:本地编译与测试
代码写好了,现在需要让它“跑”起来。在项目根目录下运行:
npm run build
编译成功后,你会看到 dist 文件夹。接下来,我们需要把这个节点“挂载”到本地的 n8n 实例中。
假设你通过 Docker 或本地命令行运行了 n8n,你需要设置环境变量 N8N_CUSTOM_NODES 指向你的编译目录:
export N8N_CUSTOM_NODES=/path/to/your/my-custom-node/dist
重启 n8n 服务。打开 n8n 界面,在左侧节点搜索栏输入 “MyCustomNode”,你就能看到自己开发的节点了!拖拽出来,连接一个简单的输入节点(如 Manual Trigger),运行工作流,看看输出结果里是否包含了那句 “Hello World”。
避坑指南:实战中的拦路虎
在开发过程中,笔者踩过不少坑,这里分享两个最常见的问题:
1. TypeScript 类型报错
n8n 的节点开发是基于 TypeScript 的。如果你习惯了写纯 JavaScript,很容易忽略类型定义。比如在操作 item.json 时,如果属性不存在于类型定义中,编译会报错。
解决方案: 在开发阶段,善用 as any 快速验证逻辑,但在发布前务必完善类型定义。或者,使用 interface 明确扩展 JSON 的属性结构。
2. 环境变量未生效
很多小伙伴设置了 N8N_CUSTOM_NODES,但重启后节点依然没出现。
原因分析: 通常是因为 n8n 的进程没有正确读取到环境变量,或者路径写错了。
解决方案: 确保你设置的是绝对路径。如果你是用 Docker 运行的 n8n,需要通过 -e 参数传递环境变量,并确保挂载了正确的卷(volume)。最简单的调试方法是查看 n8n 的启动日志,通常会打印出加载自定义节点的路径。
从本地到云端:打包与发布
当你本地测试通过后,下一步就是将节点发布到 n8n Community Nodes 商店,让更多人受益。这不仅是技术的分享,更是你个人品牌的建立。
发布流程:
- 完善文档:在
README.md中清晰描述节点的功能、配置参数以及使用场景。 - 提交审核:前往 n8n Community Nodes 仓库,按照规范提交 Pull Request(PR)。n8n 团队会审核代码的安全性和规范性。
- 版本管理:遵循语义化版本控制(SemVer),例如 v1.0.0。每次更新功能都要升级版本号。
一旦审核通过,你的节点就会出现在官方商店中。用户只需在 n8n 中点击“安装社区节点”,搜索你的节点名称即可一键使用。这种“一次开发,随处运行”的体验,正是 n8n 强大生态的体现。
FAQ 问答
Q1:自定义节点必须使用 TypeScript 吗?
A:严格来说,官方脚手架是基于 TypeScript 的,这是为了保证代码质量和类型安全。你可以写 JavaScript,但需要自己配置构建工具。为了跟上社区节奏,建议学习基础的 TypeScript 语法,这会让开发过程更顺畅。
Q2:自定义节点支持访问本地文件系统吗?
A:支持。因为自定义节点运行在 Node.js 环境中,你可以使用 fs 模块读写本地文件。但在 n8n Cloud 云服务中,由于沙箱机制,可能无法访问本地文件。如果是本地部署的 n8n,则完全没问题。
Q3:如果我想在节点中调用第三方 API,需要处理认证吗?
A:是的。通常有两种方式:一是让用户在节点配置中手动输入 API Key(推荐);二是使用 n8n 的 Credentials(凭证)系统。如果你的 API 认证方式比较复杂(如 OAuth2),建议封装成 n8n 的通用凭证,这样用户只需配置一次,无需在每个节点重复输入。
总结与资源
通过以上步骤,我们完成了从编写 “Hello World” 逻辑到最终发布上线的全流程。开发 n8n 自定义节点并没有想象中那么遥不可及,它更像是将你的 JavaScript 技能封装成可复用的自动化积木。
笔者建议,不要止步于 “Hello World”。试着去解决你工作流中遇到的真实痛点,开发一个属于你的专属节点。这不仅能提升效率,更是你进入低代码开发领域的绝佳实践。
推荐资源:
- n8n 官方文档 - 节点开发指南:最权威的 API 参考。
- n8n GitHub 仓库:阅读官方节点的源码,是最好的学习方式。
- N8N大学 (n8ndx.com):持续关注我们,获取更多进阶实战教程。