node-red教程5函数节点
5.1 函数控件介绍
函数控件在node-red中是重点,也是难点。由于其功能强⼤,能做的事情很多,所以它重要;事实上,函数控件中的“函数”⼀词,翻译为中⽂“功能”也是可以的。但是,函数是需要直接编写代码的,所以说也是难点。
assignedto节点帮助
⼀个JavaScript函数块,⽤来处理节点接收到的消息。
这些消息作为⼀个名为msg的JavaScript对象传⼊。
支持英文 按照惯例,它会有⼀个msg.payload属性,包含消息正⽂。
函数被期望返回⼀个message对象(或多个消息对象),但是可以选择不返回任何东西以阻⽌流。
详细信息
hesitate 有关编写函数的更多信息,请参见在线⽂档
口语英语
发送消息
这个函数既可以使⽤“return”向流中的下⼀个节点传递消息,也可以调⽤node.nd(messages)。
它可以返回或是发送
xiewen
⼀个单⼀的消息对象——传递给连接到第⼀个输出的节点
⼀组消息对象——传递给连接到相应输出的节点
如果数组的任何元素本⾝都是⼀组消息,那么多条消息就会被发送到相应的输出。
如果返回null,⽆论是单独还是作为数组的元素,都不会传递任何消息。
⽇志和错误处理
要记录任何信息或报告错误,可以使⽤以下功能:
node.log("Log message")
node.warn("Warning")
<("Error")
Catch节点也可以⽤来处理错误。为了调⽤Catch节点,将msg作为第⼆个参数传递给:
5.2 使⽤函数控件实现多个输出
前边使⽤switch控件时我们已经实现了根据不同的条件,来实现多个输出。Switch控件是⼀种功能控件,⽽函数控件也是功能控件。甚⾄可以说,函数控件可以通过编程实现所有功能控件的功能。接下来,我们尝试⽤函数控件实现多个输出。
5.2.1 最简单的函数控件⽤法
拖⼊⼀个inject、function与debug,⽆需任何修改,直接⽤线连接三个节点。
部署,并点击inject的输⼊按钮,观察调试窗⼝。可以看到debug节点打印的调试信息。
你可能会说,什么嘛,不加这个函数节点,直接连接inject与debug节点,不也是这个效果嘛!这个函数节点有什么⽤?
它的作⽤就是,把消息原封不动输出。原封不动的输出,也是⼀种功能,最简单的功能。
我们双击函数节点,来看⼀下⾥边的内容。
只有⼀⾏代码,return msg,返回消息。
账簿设置情况
回过头来,看函数控件的说明信息。⽤来处理节点接收到的消息,消息作为⼀个名为msg的对象传⼊。可以使⽤“return”向下⼀个节点传递消息。也就是说,函数控件的输⼊时msg对象,输出也是msg对象。在输出之前,可以对msg对象进⾏处理。所谓对象,意思是这是⼀个msg实例,是具体的数据,不是抽象的,更不是msg跟异性朋友处对象。
既然可以原封不动返回msg,当然也可以不返回。只要把语句改为return null即可。Null的意思是空值,也可以说没有值。修改代码为:
重新部署,⽆论现在如何点击inject节点的输⼊按钮,debug节点都不会打印出任何消息了。
5.2.2 在函数节点中创建并返回多个消息
函数控件中,除了可以处理输⼊的msg对象以外,也可以⾃⼰定义⼀些msg对象。另外,说明⽂件中,有介绍说function可以返回⼀个对象,或是⽤数组传递⼀组对象。我们先尝试⾃⾏建⽴⼀组对象并传递。
修改函数节点:取个合适的名称,添加如下代码,并把输出改为两路。
var msg1 = { payload:"first out of output 1" };
var msg2 = { payload:"cond out of output 1" };
var msg3 = { payload:"third out of output 1" };
上海中学生英语报
var msg4 = { payload:"only message from output 2" };
amplifier
return [ [ msg1, msg2, msg3 ], msg4 ];
拖⼊两个debug节点,命名,并分别接到函数节点的两路输出去。然后点击inject的按钮,观察调试
窗⼝的现象。
我们发现,OUT1节点⼀⼝⽓收到了3条消息,OUT2节点收到了⼀条消息,且消息的内容我们刚刚输⼊的代码有关系。跟输⼊的消息没有任何关系,因为输⼊的是时间戳。
关注最后⼀句并对⽐分析:
可以得出结论,如果想得到多个返回值,需要把返回值放到英⽂的中括号⾥。在3.1.3⼩节⾥,恰好在inject的内容⾥,输⼊数组时,也是放在中括号⾥。这说明,多个返回值需要放到⼀个数组中,数组⽤中括号括起来,⽤逗号间隔开。⽽数组元素的顺序,也就是输出对象的顺序,⽐如刚刚的OUT1收到的是msg1,msg2与msg3,⽽OUT2收到的msg4。
大街网招聘信息 另外,虽然名为数组(array),但是其边的元素并不是数字,⽽是msg对象,所以,更贴切的叫法应该是:对象组。
这个例⼦代码如下:
5.2.3 通过判断语句进⾏数据分类return msg;//⼀个返回值
return [ [ msg1, msg2, msg3 ], msg4 ];//⼀组返回值
exposure[{"id ":"adaac427.ae09a8","type ":"function","z ":"a1f259d6.8791a8","name ":"两路输出","func ":"var msg1 = { payload:\"first out of output 1\" };\nvar msg2 = { pa