# function
___
function控件是一个核心控件,它用于处理各种函数计算。function控件内部函数块使用javascript语言进行开发,有丰富的函数支持
## 一、控件介绍
### 控件外观
![](https://box.kancloud.cn/480f688213335f5b8ac7114d600b51b0_69x77.png)
### 控件属性
* **名称** |`字符串` 用于显示节点名称
* **函数** |`javascript` 用于编写javascript语言程序
* **输出** |`数字` 输出消息接口个数
### 输入消息属性
* **msg** |`对象` 包含上游节点传递的所有消息,默认`msg.payload`为主消息
### 输出消息属性
* **msg** |`对象` 包含需要传递到下游节点的所有消息,默认`msg.payload`为主消息
## 二、使用技巧
1、在使用function控件时怎么接收流消息?
在function控件里预装了一个变量msg,类型为object。该变量包含了上游节点所有输出信息,主要输出信息包含在msg.payload里面。使用时不用重新定义,即可直接使用例如:
~~~
var dome=msg.payload;
~~~
2、如何向下游传递消息?
向下游传递一个objerct对象,可以使用上游传递的流对象,也可以重新创建一个objerct对象(注意:构造新的消息对象会将上游节点携带的所有消息清空,例如HTTP In / Response流需要端到端保留msg.req和 msg.res属性。通常,函数节点应该返回它们传递的消息对象,并对其属性进行了任何更改。),例如
~~~
//直接使用上游流对象重新赋值后返回
msg.payload=1;
return msg;
//使用新实例的对象返回
var newMsg = { payload: msg.payload.length };
return newMsg;
~~~
3、如何不向下游传递流消息?
return null或不return
4、如何输出多个输出?
双击进入属性页面,在“输出”属性中配置需要多个输出的个数,然后再返回对象时将多个对象置于一个数组内返回(可用于多种信息输出,条件判断输出),例如
~~~
//条件输出
if (msg.topic === "banana") {
return [ null, msg ];
} else {
return [ msg, null ];
}
//输出多种类型数据
var newMsg = { payload: msg.payload.length };
return [msg, newMsg];
~~~
5、一个节点如何输出多条信息?
某些场景下我们需要向下游输出多条消息,我们将所有消息都包装成对象,并将这些对象置于一个数组内,再将这个数组再置一层数组,如果有多个输出,在外层数组内包裹对应的数组(里面包含多条消息)或者对象(单条消息),输出消息时会按照数组内顺序,由内到外,由前到后输出。以下示例将将展示完整用例:
界面配置:
![20190319191916.png](https://i.loli.net/2019/03/19/5c90d03aaa54f.png "20190319191916.png")
Function控件属性:
![20190319191832.png](https://i.loli.net/2019/03/19/5c90d00e9b288.png "20190319191832.png")
调试输出:
![20190319191737.png](https://i.loli.net/2019/03/19/5c90cfdc305f2.png "20190319191737.png")
6、如何发送异步消息?
如果需要在异步操作中发送流消息请使用node.send(meg)方法。请确保在函数结束时不能return消息,例如
~~~
doSomeAsyncWork(msg, function(result) {
node.send({payload:result});
});
return;
~~~
如果您在函数中使用了异步回调代码,则有可能在重新部署时处理相应的异步操作,可以通过colse事件处理,例如
node.on('close', function() {
~~~
// 需要处理未完成的请求以及关闭连接等操作
~~~
});
7、日志输出
如果节点需要将某些内容记录到控制台,它可以使用以下功能之一:
~~~
node.log("控制台输出");
node.warn("控制台以及在调试界面输出警告");
node.error("控制台以及在调试界面输出错误");
~~~
8、错误处理
程序运行发生错误时,我们在错误处理时使用node.error()方法进行报错处理,且程序应当被停止(不进行任何返回消息),如需被Catch节点捕获错误信息的话,请在第二参数中填写错误提示消息
~~~
node.error("错误提示消息", msg);
~~~
9、缓存数据
在一些场景中,我们经常会需要缓存某个数据,然后再本节点或者其他节点中使用。我们可以使用能访问缓存数据的预定义变量:
**context** – 当前节点流范围内使用
**flow** – 当前流程范围内使用
**global** – 全局
示例:
~~~
//获取流内缓存,其他类型缓存变量使用方法相似
var count = context.get('count')||0;
count += 1;
//缓存数据
context.set('count',count);
msg.count = count;
return msg;
~~~
也可以一次获取多个值,获取值返回为数组,下标为缓存变量名,任何未设置的值返回都为null
~~~
var values = flow.get(["count", "colour", "temperature"]);
flow.set(["count", "colour", "temperature"], [123, "red", "12.5"]);
~~~
如果上下文存储需要异步访问,则get和set函数需要额外的回调参数,例如
~~~
context.get('count', function(err, count) {
if (err) {
node.error(err, msg);
} else {
count = count || 0;
count += 1;
context.set('count',count, function(err) {
if (err) {
node.error(err, msg);
} else {
msg.count = count;
// send the message
node.send(msg);
}
});
}
});
~~~
- 海创IIoT可视化平台
- 简介
- 使用说明
- 安装
- 注册
- 控件使用说明
- serial
- mongodb-node
- websocket
- function
- Modbus连接接口
- Modbus连接说明
- Modbus连接示例
- 设备连接案例
- 单相智能电表(DL/T645-2007协议)
- 单相智能电表(Modbus协议)
- PLC连接案例
- 西门子PLC
- 三菱PLC
- 欧姆龙PLC(HostLink协议)
- 欧姆龙PLC(Fins协议)
- 西门子s7-200 smart跑马灯场景效果
- 松下PLC
- 传感器连接案例
- 温湿度变送器
- PM空气质量检测仪
- 数据上报阿里云
- 数据上报百度云
- 微信公众号连接示例
- 获取阿里云数据
- 使用OPCUA