Skip to content

理解数据结构

在本章中,您将了解 n8n 的数据结构以及如何使用代码节点转换数据和模拟节点输出。

n8n的数据结构

从根本上讲,n8n 节点充当着提取、转换、加载 (ETL) 工具的功能。这些节点允许您从多个不同的来源访问(提取)数据,以特定方式修改(转换)该数据,并将其传递(加载)到所需的位置。

工作流中,从一个节点移动到另一个节点的数据必须采用每个节点能够识别和解释的格式(结构)。在 n8n 中,这个必需的结构是一个对象数组。

关于对象数组

数组是值的列表。数组可以为空,也可以包含多个元素。每个元素存储在列表中的某个位置(索引),从 0 开始,可以通过索引号引用。例如,在数组中,元素存储在索引 2 处。

对象存储的是键值对,而不是像数组那样将值存储在编号索引处。键值对的顺序并不重要,因为可以通过引用键名来访问值。例如,下面的对象包含两个属性(和):

1
2
3
4
{
	name: 'Michelangelo',
	color: 'blue',
}

对象数组是包含一个或多个对象的数组。例如,下面的数组包含四个对象:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
var turtles = [
	{
		name: 'Michelangelo',
		color: 'orange',
	},
	{
		name: 'Donatello',
		color: 'purple',
	},
	{
		name: 'Raphael',
		color: 'red',
	},
	{
		name: 'Leonardo',
		color: 'blue',
	}
];

您可以使用点符号和语法访问对象的属性。例如,获取第二只乌龟的颜色。

从一个节点发送到另一个节点的数据以 JSON 对象数组的形式发送。此集合中的元素称为项 (Item)。

项目

n8n 节点对每项传入数据执行其操作。

客户数据存储节点中的项目

使用代码节点创建数据集

现在您已经熟悉了 n8n 数据结构,您可以使用它来创建自己的数据集或模拟节点输出。为此,请使用“代码”节点编写 JavaScript 代码,定义具有以下结构的对象数组:

1
2
3
4
5
6
7
return [
	{
		json: {
			apple: 'beets',
		}
	}
];

例如,代表忍者神龟的对象数组在代码节点中看起来像这样:

Code 节点中的对象数组

JSON 对象

请注意,此对象数组包含一个额外的键: 。n8n 希望您将数组中的每个对象包装在另一个对象中,并使用键。

n8n 中的数据结构图解

以 n8n 使用的正确结构传递数据是一种很好的做法。但如果您忘记为某个项目添加键,也不用担心,n8n(0.166.0 及以上版本)会自动添加。

您还可以使用嵌套对,例如,如果您想定义主色和次色。在这种情况下,您需要进一步将键值对括在花括号中。

n8n数据结构视频

本次演讲对 n8n 中的数据结构进行了更详细的解释。

锻炼

在Code节点中,创建一个名为 的对象数组,包含属性和,属性 进一步拆分为和。

Show me the solution

代码节点的JavaScript 代码字段中,您必须编写以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
var myContacts = [
	{
		json: {
			name: 'Alice',
			email: {
				personal: 'alice@home.com',
				work: 'alice@wonderland.org'
			},
		}
	},
	{
		json: {
			name: 'Bob',
			email: {
				personal: 'bob@mail.com',
				work: 'contact@thebuilder.com'
				},
		}
	},
];

return myContacts;

当你执行代码节点时,结果应该如下所示:

代码节点的结果

使用代码节点引用节点数据

就像可以使用表达式引用其他节点的数据一样,您也可以使用Code 节点中的一些方法和变量

在继续下一个练习之前,请确保您已阅读这些页面。

锻炼

让我们以上一个练习为基础,在该练习中,您使用代码节点创建了一个包含两个联系人及其姓名和电子邮件地址的数据集。现在,将第二个代码节点连接到第一个节点。在新节点中,编写代码以创建一个名为 的新列,该列引用第一个联系人的工作电子邮件地址。

Show me the solution

代码节点的JavaScript 代码字段中,您必须编写以下代码:

1
2
3
let items = $input.all();
items[0].json.workEmail = items[0].json.email['work'];
return items;

当你执行代码节点时,结果应该如下所示:

代码节点参考

转换数据

来自某些节点的传入数据可能具有与 n8n 中使用的数据结构不同的数据结构。在这种情况下,您需要转换数据,以便可以单独处理每个项目。

数据转换最常见的两种操作是:

  • 从一个项目创建多个项目
  • 从多个项目创建单个项目

为了达到上述目的,有几种方法可以转换数据:

  • 使用 n8n 的数据转换节点。使用这些节点可以修改包含列表(数组)的传入数据的结构,而无需在代码节点中使用 JavaScript 代码:
    • 使用
    • 将包含列表的单个数据项拆分为多个数据项。
    • 使用
    • 可以将单独的数据项或其中的部分数据项组合成单个数据项。
  • 使用代码节点编写 JavaScript 函数,使用“对所有项目运行一次”模式修改传入数据的数据结构:
    • 要从单个项目创建多个项目,可以使用如下 JavaScript 代码。此示例假设该项目具有一个名为的键,
    • 并设置为以下形式的项目数组
    • 要从多个项目创建单个项目,可以使用以下 JavaScript 代码:

这些 JavaScript 示例假设您要转换的是整个输入。与上面的练习一样,您也可以通过在项目列表中标识特定字段来执行任一操作。例如,如果我们的 workEmail 示例在单个字段中包含多封电子邮件,我们可以运行如下代码:

1
2
3
4
5
6
let items = $input.all();
return items[0].json.workEmail.map(item => {
	return {
		json: item
	}
});

锻炼

  1. 使用HTTP 请求节点向 PokéAPI 发出 GET 请求。(此 API 不需要身份验证)。
  2. 使用拆分节点转换字段中的数据。
  3. 使用代码节点转换字段中的数据。
Show me the solution
  1. 要从 PokéAPI 获取 pokemon,请使用以下参数执行HTTP 请求节点
    • 身份验证
    • :无
    • 请求方法
    • :GET
    • URL
    • :https://pokeapi.co/api/v2/pokemon
  2. 要使用拆分节点转换数据,请将此节点连接到HTTP 请求节点并设置以下参数:
    • 要拆分的字段
    • :结果
    • 包括
    • :无其他字段
  3. 要使用代码节点转换数据,请将此节点连接到HTTP 请求节点,并在 JavaScript 代码字段中写入以下代码: