首页
/ n8n自定义节点开发:扩展集成能力全解析

n8n自定义节点开发:扩展集成能力全解析

2026-02-05 04:20:00作者:江焘钦

n8n作为一款开源工作流自动化平台,凭借其400+内置集成和灵活的工作流设计能力,已成为开发者构建自动化流程的首选工具。然而,面对企业多样化的系统集成需求,内置节点往往难以覆盖所有场景。本文将系统讲解如何开发n8n自定义节点,从环境搭建到发布部署,全方位解锁扩展n8n集成能力的技术路径。

n8n平台界面

开发环境准备

自定义节点开发需要基于TypeScript环境,n8n官方提供了n8n-node-dev工具简化开发流程。通过以下步骤完成环境配置:

核心依赖安装

# 全局安装节点开发工具
npm install n8n-node-dev -g

# 克隆项目仓库
git clone https://gitcode.com/GitHub_Trending/n8/n8n
cd n8n

开发工具链解析

n8n-node-dev提供三大核心功能:

  • 项目脚手架:通过模板快速生成节点/凭证基础代码
  • 构建工具:自动编译TypeScript并同步到n8n扩展目录
  • 热重载:开发过程中实时更新节点代码

工具配置文件位于packages/node-dev/package.json,核心依赖包括TypeScript编译器、代码生成模板和文件监听模块。

节点架构深度解析

n8n节点采用面向对象设计,每个节点本质是实现INodeType接口的类。通过分析HttpRequest节点的架构,可总结出节点的核心组成部分:

节点类型分类

n8n节点分为三大类型,对应不同的执行逻辑:

节点类型 核心方法 应用场景 示例节点
普通节点 execute 数据处理/转换 Set节点
触发器节点 trigger 定时/事件触发 Cron节点
Webhook节点 webhook 接收HTTP请求 Webhook节点

节点描述结构

节点元数据通过INodeTypeDescription接口定义,包含以下关键属性:

{
  displayName: "HTTP Request",  // 编辑器显示名称
  name: "httpRequest",          // 内部标识名
  icon: { light: "file:httprequest.svg", dark: "file:httprequest.dark.svg" }, // 图标配置
  group: ["output"],            // 功能分组
  version: 4.2,                 // 版本号
  description: "Makes an HTTP request and returns the response data", // 描述文本
  defaults: { name: "HTTP Request", color: "#0004F5" }, // 默认配置
  inputs: ["main"],             // 输入连接类型
  outputs: ["main"],            // 输出连接类型
  properties: mainProperties,   // 节点参数定义
  credentials: [...]            // 凭证配置
}

完整的描述结构定义可参考n8n-workflow库中的接口定义。

开发实战:构建天气API节点

以开发一个调用OpenWeatherMap API的自定义节点为例,完整演示节点开发流程。

1. 生成节点基础代码

使用n8n-node-dev创建节点脚手架:

n8n-node-dev new weather-api --type execute

工具会基于execute模板生成基础代码,包含:

  • 节点类定义
  • 基础属性配置
  • execute方法框架

2. 定义节点属性

节点属性定义决定了编辑器中的参数配置界面。为天气API节点添加以下配置:

properties: [
  {
    displayName: "城市名称",
    name: "city",
    type: "string",
    default: "",
    placeholder: "输入城市名称",
    description: "要查询天气的城市",
    required: true
  },
  {
    displayName: "API密钥",
    name: "apiKey",
    type: "string",
    default: "",
    typeOptions: { password: true },
    required: true
  },
  {
    displayName: "温度单位",
    name: "unit",
    type: "options",
    options: [
      { name: "摄氏度", value: "metric" },
      { name: "华氏度", value: "imperial" }
    ],
    default: "metric"
  }
]

属性类型系统支持字符串、数字、选项等多种输入类型,完整类型定义参见NodePropertyTypes。

3. 实现核心逻辑

execute方法中实现API调用逻辑,关键步骤包括:

async execute(this: IExecuteFunctions): Promise<INodeExecutionData[][]> {
  // 获取用户输入参数
  const items = this.getInputData();
  const apiKey = this.getNodeParameter('apiKey', 0) as string;
  const unit = this.getNodeParameter('unit', 0) as string;
  
  // 处理每个输入项
  for (let itemIndex = 0; itemIndex < items.length; itemIndex++) {
    const city = this.getNodeParameter('city', itemIndex) as string;
    
    // 构建API请求
    const requestOptions: IRequestOptions = {
      method: 'GET',
      url: `https://api.openweathermap.org/data/2.5/weather`,
      qs: {
        q: city,
        appid: apiKey,
        units: unit
      }
    };
    
    // 发送请求并处理响应
    try {
      const responseData = await this.helpers.request(requestOptions);
      items[itemIndex].json = {
        city,
        temperature: responseData.main.temp,
        conditions: responseData.weather[0].description,
        humidity: responseData.main.humidity
      };
    } catch (error) {
      // 错误处理
      if (this.continueOnFail()) {
        items[itemIndex].json = { error: error.message };
        continue;
      }
      throw error;
    }
  }
  
  return [items];
}

代码中使用this.helpers.request方法发送HTTP请求,该工具方法自动处理认证、错误重试和响应解析。

4. 凭证系统集成

对于需要认证的API,应创建专用凭证类型。基于凭证模板生成代码:

export class OpenWeatherMapApi implements ICredentialType {
  name = "openWeatherMapApi";
  displayName = "OpenWeatherMap API";
  
  properties: INodeProperties[] = [
    {
      displayName: "API密钥",
      name: "apiKey",
      type: "string",
      default: "",
      typeOptions: { password: true }
    }
  ];
}

在节点描述中引用凭证:

credentials: [
  {
    name: "openWeatherMapApi",
    required: true
  }
]

凭证系统会自动加密存储敏感信息,通过this.getCredentials安全获取:

const credentials = await this.getCredentials('openWeatherMapApi');
const apiKey = credentials.apiKey;

高级功能实现

文件处理机制

当节点需要处理二进制数据(如图像、PDF)时,需使用n8n的二进制数据系统。以HTTP Request节点的文件下载功能为例:

// 配置请求接收二进制流
requestOptions.encoding = null;
requestOptions.json = false;
requestOptions.useStream = true;

// 处理响应流
const response = await this.helpers.request(requestOptions);
const binaryData = await this.helpers.prepareBinaryData(response);

// 设置文件名
binaryData.fileName = setFilename(
  binaryData,
  requestOptions,
  responseFileName
);

// 添加到输出项
item.binary = { data: binaryData };

核心工具函数prepareBinaryData位于BinaryDataHelper,负责流处理和Base64编码转换。

动态选项加载

对于需要从API获取选项列表的场景(如下拉选择框),可实现loadOptionsMethod

methods = {
  loadOptions: {
    async getCities(this: ILoadOptionsFunctions) {
      const response = await this.helpers.request({
        url: 'https://api.example.com/cities',
        method: 'GET'
      });
      
      return response.map(city => ({
        name: city.name,
        value: city.id
      }));
    }
  }
}

在属性定义中引用该方法:

{
  displayName: "城市",
  name: "cityId",
  type: "options",
  typeOptions: {
    loadOptionsMethod: "getCities"
  },
  default: ""
}

测试与调试策略

本地开发工作流

使用n8n-node-dev的热重载功能加速开发:

# 监听文件变化并自动构建
n8n-node-dev build --watch

工具会将编译后的节点自动同步到n8n扩展目录(~/.n8n/custom/),此时在n8n编辑器中可直接看到开发中的节点。

测试框架应用

n8n使用Jest作为测试框架,节点测试文件位于test/目录。典型的测试用例结构:

describe('WeatherApiNode', () => {
  const node = new WeatherApiNode();
  
  it('should return correct temperature', async () => {
    // 准备测试数据
    const items = [{ json: {} }];
    const mockExecuteFunctions = {
      getNodeParameter: jest.fn((name) => {
        if (name === 'city') return 'Beijing';
        if (name === 'apiKey') return 'test_key';
      }),
      helpers: {
        request: jest.fn().mockResolvedValue({
          main: { temp: 25, humidity: 60 },
          weather: [{ description: 'sunny' }]
        })
      }
    };
    
    // 执行测试
    const result = await node.execute.call(
      mockExecuteFunctions as unknown as IExecuteFunctions,
      items
    );
    
    // 断言结果
    expect(result[0][0].json.temperature).toBe(25);
  });
});

发布与分发

节点打包

开发完成的节点可打包为npm包,目录结构遵循:

weather-node/
├── src/
│   ├── WeatherApi.node.ts
│   └── WeatherApi.credentials.ts
├── package.json
└── tsconfig.json

打包配置参考nodes-base/package.json,关键配置项:

{
  "main": "dist/index.js",
  "types": "dist/index.d.ts",
  "scripts": {
    "build": "tsc"
  }
}

社区贡献流程

若希望将节点贡献到n8n主项目,需遵循贡献指南:

  1. 创建节点目录:packages/nodes-base/nodes/WeatherApi
  2. 添加节点文件:实现节点类和描述文件
  3. 编写测试:覆盖主要功能和边界情况
  4. 更新文档:添加使用说明和示例工作流
  5. 提交PR:遵循CONTRIBUTING.md规范

结语

自定义节点开发是扩展n8n能力的核心方式,通过本文介绍的架构设计、开发流程和高级特性,开发者可构建满足特定业务需求的集成节点。n8n的节点生态系统持续增长,欢迎通过社区论坛分享你的节点作品。

节点开发过程中遇到的问题,可参考以下资源:

通过掌握自定义节点开发,你可以将n8n打造成连接企业所有系统的自动化中枢,实现真正的无代码/低代码数据流动。

n8n工作流示例

登录后查看全文
热门项目推荐
相关项目推荐