Skip to content

理解数据结构#

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

n8n 的数据结构#

从基本意义上讲,n8n 节点作为提取、转换、加载(ETL)工具运行。这些节点允许您从多个不同的来源访问(提取)数据,以特定方式修改(转换)该数据,并将其传递(加载)到需要的地方。

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

关于对象数组

数组是值的列表。数组可以为空或包含多个元素。每个元素存储在列表中的位置(索引),从 0 开始,可以通过索引号引用。例如,在数组 ["Leonardo", "Michelangelo", "Donatello", "Raphael"]; 中,元素 Donatello 存储在索引 2。

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

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

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

 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',
	}
];

您可以使用点表示法和语法 object.property 访问对象的属性。例如,turtles[1].color 获取第二只乌龟的颜色。

从一个节点发送到另一个节点的数据作为 JSON 对象数组发送。此集合中的元素称为项目。

项目

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

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

使用代码节点创建数据集#

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

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

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

代码节点中的对象数组

JSON 对象

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

n8n 中数据结构的说明

最好的做法是以 n8n 使用的正确结构传递数据。但如果您忘记向项目添加 json 键,不用担心,n8n(版本 0.166.0 及以上)会自动添加它。

您还可以有嵌套对,例如,如果您想定义主要颜色和次要颜色。在这种情况下,您需要进一步将键值对包装在大括号 {} 中。

n8n 数据结构视频

这个演讲 提供了对 n8n 中数据结构的更详细解释。

练习#

在代码节点中,创建一个名为 myContacts 的对象数组,其中包含属性 nameemail,并且 email 属性进一步分为 personalwork

显示解决方案

代码节点中,在 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: '[email protected]',
				work: '[email protected]'
			},
		}
	},
	{
		json: {
			name: 'Bob',
			email: {
				personal: '[email protected]',
				work: '[email protected]'
				},
		}
	},
];

return myContacts;

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

代码节点的结果

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

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

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

练习#

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

显示解决方案

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

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

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

代码节点引用

转换数据#

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

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

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

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

  • 使用 n8n 的数据转换节点。使用这些节点修改包含列表(数组)的传入数据的结构,而无需在代码节点中使用 JavaScript 代码:
    • 使用 拆分节点 将包含列表的单个数据项目分离为多个项目。
    • 使用 聚合节点 获取单独的项目或其部分,并将它们组合到单独的项目中。
  • 使用代码节点编写 JavaScript 函数,使用为所有项目运行一次模式修改传入数据的数据结构:
    • 要从单个项目创建多个项目,您可以使用如下 JavaScript 代码。此示例假设项目有一个名为 data 的键,设置为项目数组,形式为:[{ "data": [{<item_1>}, {<item_2>}, ...] }]
      1
      2
      3
      4
      5
      return $input.first().json.data.map(item => {
          return {
              json: item
          }
      });
      
    • 要从多个项目创建单个项目,您可以使用此 JavaScript 代码:
      1
      2
      3
      4
      5
      6
      7
      return [
      	{
          	json: {
          		data_object: $input.all().map(item => item.json)
          	}
          }
        ];
      

这些 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 https://pokeapi.co/api/v2/pokemon 发出 GET 请求。(此 API 不需要身份验证)。
  2. 使用 拆分节点 转换 results 字段中的数据。
  3. 使用 代码节点 转换 results 字段中的数据。
显示解决方案
  1. 要从 PokéAPI 获取 pokemon,执行具有以下参数的 HTTP 请求节点
    • 身份验证:None
    • 请求方法:GET
    • URL:https://pokeapi.co/api/v2/pokemon
  2. 要使用 拆分节点 转换数据,将此节点连接到 HTTP 请求节点 并设置以下参数:
    • 要拆分的字段:results
    • 包含:No Other Fields
  3. 要使用 代码节点 转换数据,将此节点连接到 HTTP 请求节点 并在 JavaScript 代码字段中编写以下代码:
    1
    2
    3
    4
    5
    6
    let items = $input.all();
    return items[0].json.results.map(item => {
    	return {
    		json: item
    	}
    });