配置目的
在自动化流程中,我们经常通过 Webhook 接收外部系统(如 Slack、CRM、订单系统)发来的数据。
这些数据通常是JSON格式,我们需要从中提取关键信息,例如用户ID、订单号等。
本教程旨在教会你使用 Code 节点,解析这些数据,并创建一个唯一的“分布式锁”标识(Lock Key)。
这能确保同一任务(如处理某个用户的请求)不会被重复执行,保证流程的稳定和准确。
前置条件
在开始之前,请确保你已完成 N8N 和 Redis 的基本连接配置。
本教程专注于 Code 节点的代码逻辑,不会涉及 Redis 连接的具体步骤。
账号与平台准备
你需要清楚地了解你的 Webhook 平台发送的 JSON 数据是什么样的。
如何查看?
最简单的方法是,在 Webhook 节点后连接一个 NoOp 节点,然后触发一次 Webhook,在 NoOp 节点的输入(Input)中查看完整的数据结构。
例如,一个来自 Slack 的数据可能长这样:
{"body":{"user_id":"U123ABC","channel_id":"C456DEF","text":"你好"}}
你需要记下那个能唯一标识一次任务的字段名,比如这里的 `user_id`。
关键配置步骤
现在,我们一步步来配置 Code 节点。
添加并打开Code节点
在你的 Webhook 节点之后,点击 + 号,搜索并添加一个 Code 节点。
保持语言设置为默认的 JavaScript 即可。
编写核心代码
将以下代码模板粘贴到 Code 节点的代码区域:
// Webhook收到的数据通常在$json.body中,且为字符串格式
const payload = JSON.parse($json.body);
// 从数据中提取你需要的唯一标识符
// 请将 'user_id' 替换成你数据中的实际字段名
const uniqueId = payload.user_id;
// 你也可以提取多个字段来组合
const channelId = payload.channel_id;
// 定义一个用于分布式锁的Lock Key
// 格式可以自定义,但必须保证唯一性
const lockKey = `n8n-lock:${channelId}:${uniqueId}`;
// 返回所有数据,并附加上我们新创建的变量
return [{
json: {
...$json, // 保留从Webhook收到的所有原始数据
lockKey: lockKey // 添加我们自定义的lockKey变量
}
}];
如何修改代码
这段代码的核心是解析和提取,你需要根据你的实际情况修改它。
1. 修改 `JSON.parse()` 语句
代码中的 $json.body 指的是上一个节点(Webhook)输出数据中的 `body` 字段。如果你的数据在其他字段,比如 `data`,你需要把它改成 JSON.parse($json.data)。
2. 修改 `payload.var1`
代码中的 payload.user_id 是一个示例。你需要查看你的实际数据,找到那个独一无二的字段。
- 如果你的唯一ID字段是 `orderNumber`,就改成
payload.orderNumber。 - 如果数据嵌套很深,比如在 `customer.id` 中,就改成
payload.customer.id。
简单说,就是把示例代码中的 `user_id` 和 `channel_id` 换成你自己的“钥匙”。
常见错误与排查
新手最容易遇到两个问题,别担心,很容易解决。
错误:payload is not defined
这个错误通常意味着 JSON.parse($json.body) 这一行出了问题。
原因: Webhook 传来的数据可能不在 $json.body 里,或者它根本不是一个 JSON 字符串。
解决方法: 回到上一个节点,仔细检查输出数据的结构,确认包含 JSON 字符串的准确字段路径,并修改代码。
错误:Key 值生成为空
如果你发现生成的 lockKey 变量是空的,或者像 `n8n-lock::` 这样缺少了关键部分。
原因: 很可能是因为 payload.user_id 这样的表达式没有取到值(结果是 undefined)。
解决方法: 仔细检查你的字段名,包括大小写和拼写,是否和原始数据中的完全一致。一个小小的拼写错误就会导致取值失败。

