最近分享了好多n8n的工作流,但是发现拿到n8n工作流的小伙伴不太懂代码节点的使用。
今天这篇文章做个基础教学,介绍下n8n中代码节点的具体使用方法。
n8n中的代码节点确实不如coze中的代码节点好用。体现在2个方面 1 配置不直观 2 无法安装第三方的库。
coze上的参数可以通过界面进行指定,输出参数也是可以界面配置。
这样的好处是操作方便,而且比较清晰。但n8n中就比较抽象一点,输入参数是用json格式来表达的。
比如下面两个item的数据传入到代码节点
n8n中都是把输入参数当做一个json实体来对待的。上面两个item就分别变成{"para1": [1, 2, 3, 4]}和{"para2": ["a", "b", "c"]} 这种json结构
代码节点中要调用的时候,就用这种形式:_input.all()[0].json['para1']。 并且返回参数也必须是json格式。
另外代码还有两种调用方式:Run Once for All Items和Run Once for Each Item。
这两种方式分别对应不同的代码处理方式以及返回结果。其实只要搞清楚了这两种方式,n8n中的代码节点就非常清晰了
首先用这个组网图来演示,这里有2个edit fields,分别赋值了两个参数,分别是para1=[1,2,3,4], para2=['a','b','c']。 然后通过一个Merge节点连在一起。传递给代码节点。
在Merge节点的输出就能看到显示是2 items。表示有2个items。这里的items就对应代码节点中的items。
搞清楚这个之后,下面就来说说Run Once for All Items和Run Once for Each Item的不同点
01.Run Once for Each Item
Mode = Run Once for Each Item 表示的意思是,将输入的 Items 列表中的每一个 Item,逐个传入代码节点中执行一次。然后把每次的返回结果汇总在一起反馈
这里的输入有2个items, 所以代码会执行2次
第一次执行:代码接收到的数据是第一个 Item:{"para1": [1, 2, 3, 4]}
第二次执行:代码接收到的数据是第二个 Item:{"para2": ["a", "b", "c"]}
第一次执行,处理 {"para1": [1,2,3,4]},返回 {"ret": 1}
第二次执行,处理 {"para2": ["a","b","c"]},返回 {"ret": 1}
注意:这里每次返回的都是单独的一个字典。这里的反馈和Run Once for All Items有区别,后面会讲到
n8n 会收集每一次代码执行的返回值。因为代码执行了两次,所以它就收集到了两个结果对象,并将它们组合成一个新的输出数组:
[ {"ret": 1}, {"ret": 1} ]
从执行的结果中也可以看到符合分析预期。
但Run Once for Each Item我是不建议用的,因为有个比较大的缺陷,比如下面这个,我想对para1和para2中的第一个元素改成x,但是返回的结果都只有para1的。
这是因为每次执行的时候,我只能选择返回一个字典。没法做适配。
所以在n8n中的code节点,都建议使用Run Once for Each Item
02.Run Once for All Items
看这个名字,很好理解,不管多少个items,只执行一次。同时也只返回一次。
如果有多个item, 那么代码节点后首先组装成一个item。 还使用上面的工作流,在code节点输入的时候,就变成了如下形式
[{"para1": [1, 2, 3, 4]},{"para2": ["a","b","c"]}]
一个列表里面包含了2个json数据:para1和para2
回到刚才说的需求:想对para1和para2中的第一个元素改成x,然后同时返回para1和para2
节点代码如如下
item1 = _input.all()[0]
item2 = _input.all()[1]
item1.json['para1'][0]='x'
item2.json['para2'][0]='x'
output=[]
output.append({'para1':item1})
output.append({'para2':item2})
eturn output
因为有2个item, 所以分别用_input.all()[0]和_input.all()[1]取出来。然后分别进行赋值。
执行输出符合预期。
另外使用Run Once for All Items的时候要注意,返回参数必须是一个列表(list)。然后把json格式依次append进这个列表。Run Once for Each Item只需要返回单个json数据即可。
写在最后
虽然n8n中的代码节点不太好用。但是n8n中提供大量的功能节点弥补了这个缺陷。比如HTTP request节点,还有不少官方的调用节点
n8n中的代码节点,更多的时候是起个辅助的作用。很多人吐槽n8n中的代码节点不如coze好用,这也是事实。
最近n8n又融资了1.8亿美刀,应该是又要升级一堆功能,不知道会不会把代码节点给升级下。
你好,我是江枫,本硕电子信息工程,主业程序员。AI时代,开启自己自媒体IP之路。毕业至今,换过一次工作,呆过2个公司。下一份工作:数字游民。
本文由公众号“程序猿玩AI”授权转载|原文地址: https://mp.weixin.qq.com/s/lBTqgoJ8OUewWq_mDkYfZw|(编辑:潇飞)