告别生硬拼接:让 n8n 的“真·编程”能力为你所用
在 N8N大学 的日常交流群里,我见过太多同学把 Code 节点当成一个简单的“文本拼接器”来用。要么是把 HTTP 请求节点返回的数据硬写进脚本,要么是处理完逻辑后还需要再接一个 Set 节点来格式化输出。
这其实是一种浪费。n8n 的 Code 节点(基于 Node.js)本质上是一个全功能的运行时环境。当你把它和 HTTP Request 节点深度结合时,你就能实现原生节点做不到的“动态请求”逻辑——比如根据 API 返回的数据量,自动分页抓取,或者对敏感数据进行加密后再发送。
今天,笔者就带你拆解几个实战技巧,教你如何用代码节点“接管” HTTP 节点,实现更高级的自动化流。
技巧一:利用 Code 节点动态生成 HTTP 参数
很多时候,我们需要请求的 URL 或 Header 是动态变化的。虽然 n8n 支持表达式,但在复杂逻辑下,直接在 Code 节点里组装 JSON 对象会更清晰、更易维护。
场景: 你需要批量查询用户信息,每个用户的 ID 存储在不同的数据集中。
实操步骤:
- 前置节点(如
Spreadsheet File或Set):读取用户 ID 列表。 - Code 节点(核心): 遍历输入数据,构造 HTTP 请求所需的
query params对象。 - HTTP Request 节点: 接收 Code 节点的输出,利用
Batching功能(如果 API 支持)或简单地将请求参数传递给下一级。
关键代码示例:
for (const item of $input.all()) {
// 假设输入项包含 userId 字段
const userId = item.json.userId;
// 动态构造请求参数
item.json.params = {
id: userId,
details: true
};
// 也可以动态修改 URL
item.json.url = `https://api.example.com/users/${userId}`;
}
return $input.all();
这样,你后续的 HTTP 节点就可以直接引用 {{ $json.params }} 或 {{ $json.url }},实现了逻辑与配置的解耦。
技巧二:处理 API 分页与递归抓取
这是 Code 节点与 HTTP 节点协同的“杀手级”场景。很多 API 返回的数据是分页的,如果只用 n8n 原生的循环节点,配置往往很僵硬。
场景: 抓取一个返回大量数据的 API,它只提供下一页的 URL(Next URL),而不是页码。
实操步骤:
- HTTP Request 节点(初始): 发送第一次请求。
- Code 节点(递归逻辑): 检查返回数据中是否有
next_page_url。 - 决策节点(如 IF): 判断 Code 节点是否输出了新的 URL。
- 循环: 如果有新 URL,将数据暂存,并让 HTTP 节点再次请求新 URL。
避坑指南: 在 Code 节点中处理递归时,务必将已获取的数据通过 Binary Data 或外部存储(如 Redis)暂存,否则 n8n 的内存可能会因为数据量过大而溢出(OOM)。笔者建议使用 Aggregate 节点在循环结束后统一合并数据。
技巧三:在发送前对数据进行加密或签名
在对接某些对安全性要求极高的 API(如支付接口、物流接口)时,它们通常要求对请求体进行 HMAC 签名。这种复杂的加密逻辑,标准的 HTTP 节点无法独立完成。
场景: 向某支付网关发送订单数据,需生成 X-Signature Header。
实操步骤:
- Set 节点: 准备基础的订单数据。
- Code 节点(加密): 引入 Node.js 内置的
crypto模块。 - HTTP Request 节点: 发送带有自定义签名 Header 的请求。
核心代码逻辑:
const crypto = require('crypto');
// 获取上一步的数据
const data = items[0].json;
// 生成签名 (HMAC-SHA256 示例)
const secret = 'your_api_secret';
const payload = JSON.stringify(data);
const signature = crypto.createHmac('sha256', secret)
.update(payload)
.digest('hex');
// 将签名写入 Header
items[0].headers = {
'X-Signature': signature,
'Content-Type': 'application/json'
};
return items;
注意:如果你的 n8n 是云服务版,可能需要安装第三方库;如果是自托管版本,Node.js 原生模块通常可用。
如何优雅地处理 HTTP 错误?
默认情况下,如果 HTTP Request 节点报错(如 404, 500),整个工作流会中断。但在批量处理场景下,我们希望跳过错误项继续执行。
实操技巧:
在 HTTP Request 节点的设置中,勾选 “Continue On Fail”(失败时继续)。这样,即使请求失败,n8n 也会继续向下传递数据,只是数据中包含了错误信息。
此时,紧跟一个 Code 节点来过滤这些错误:
// 过滤掉包含 error 字段的 item return items.filter(item => !item.json.error);
这种组合拳能极大提升工作流的鲁棒性。
FAQ 问答
1. Code 节点和 HTTP 节点协同会拖慢工作流速度吗?
不会。n8n 的 Code 节点执行效率很高,处理毫秒级的数据转换对整体耗时影响微乎其微。除非你在 Code 节点中写了死循环或同步的 I/O 操作(通常应避免)。
2. 我可以在 Code 节点中直接发起 HTTP 请求吗?
可以,使用 Node.js 的 axios 或 fetch。但 N8N大学 不推荐这样做,因为这会绕过 n8n 原生的 HTTP 节点特性(如重试机制、凭证管理、请求日志)。除非你有极其特殊的 Header 处理需求,否则请坚持使用原生节点组合。
3. 在 Code 节点里怎么处理二进制数据(如图片)?
n8n 的 Code 节点默认处理 JSON。如果需要处理二进制数据(例如从 HTTP 下载图片后在 Code 节点处理),你需要访问 $binary 对象。不过,大多数二进制转换(如 Base64)建议在 HTTP 节点直接设置 Response Format = File,或者在 Code 节点通过 Buffer API 处理。
总结与资源
n8n 的 Code 节点不是简单的补丁,而是连接各个标准化节点的“胶水”。通过与 HTTP 节点的深度协同,你可以实现动态参数构造、复杂数据签名以及智能分页抓取等高级功能。
如果你在自定义代码编写中遇到难题,欢迎访问 N8N大学 (n8ndx.com) 查阅更多实战案例。记住,低代码不等于无代码,掌握一点点编程思维,能让你的自动化流程拥有无限可能。