多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 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); } }); } }); ~~~