跳至内容

理解数据结构#

在本章节中,您将了解n8n的数据结构,并学习如何使用Code节点来转换数据及模拟节点输出。

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对象数组的形式发送。此集合中的元素称为项。

Items

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

Items in the Customer Datastore node

使用Code节点创建数据集#

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

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

例如,代表忍者神龟的对象数组在代码节点中会显示如下:

Array of objects in the Code node

JSON对象

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

Illustration of data structure in n8n

最佳实践是以n8n使用的正确数据结构传递数据。但如果您忘记为项目添加json键也不必担心,n8n(0.166.0及以上版本)会自动添加。

你也可以使用嵌套键值对,例如如果你想定义主色和次色。这种情况下,你需要用花括号{}进一步包裹键值对。

n8n 数据结构视频

This talk 提供了关于n8n中数据结构的更详细说明。

练习#

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

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;

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

代码节点的运行结果

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

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

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

练习#

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

Show me the solution

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

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

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

代码节点参考

数据转换#

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

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

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

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

  • Use n8n's 数据转换节点. Use these nodes to modify the structure of incoming data that contain lists (arrays) without needing to use JavaScript code in the Code node:
    • 使用 Split Out 节点 将包含列表的单个数据项拆分为多个项。
    • 使用Aggregate节点将分散的条目或其部分内容分组整合为单个条目。
  • Use the Code node to write JavaScript functions to modify the data structure of incoming data using the Run Once for All Items mode:
    • 要从单个项目创建多个项目,您可以使用如下JavaScript代码。此示例假设项目有一个名为data的键,设置为以下形式的项目数组:[{ "data": [{}, {}, ...] }]:
      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发起GET请求https://pokeapi.co/api/v2/pokemon。(该API无需身份验证)。
  2. 使用Split Out节点转换results字段中的数据。
  3. 使用代码节点转换results字段中的数据。
Show me the solution
  1. To get the pokemon from the PokéAPI, execute the HTTP Request node with the following parameters:
    • 认证方式: 无
    • 请求方法: GET
    • URL: https://pokeapi.co/api/v2/pokemon
  2. To transform the data with the Split Out node, connect this node to the HTTP Request node and set the following parameters:
    • 要拆分的字段: results
    • 包含: 无其他字段
  3. 要使用代码节点转换数据,请将此节点连接到HTTP请求节点,并在JavaScript代码字段中编写以下代码:
    1
    2
    3
    4
    5
    6
    let items = $input.all();
    return items[0].json.results.map(item => {
    	return {
    		json: item
    	}
    });
    
优云智算