lab06- Node-RED 其他控件节点

一、目录

1. 实验目的

  • 掌握 node-red 其他特有的 API

2. 实验步骤

2.1 node 相关 api 的应用

  • 函数控件的功能强大,甚至可以用函数控件实现其它所有功能控件的功能。在函数空间中,除了可以调用 JS 自带的各种方法以外,含有一些 node-red 特有的 API 可以使用,说明如下:
node.id : 函 数 节 点 的ID, 在0 .19 版 本 添 加
node.name : 函 数 节 点 的 名 字, 在0 .19 版 本 增 加
node.log ( . . ) : 记 录 一 条 消 息
node.warn ( . . ) : 记 录 一 条 警 告 消 息
node.error ( . . ) : 记 录 一 条 错 误 消 息
node.debug ( . . ) : 记 录 一 条 调 试 消 息
node.trace ( . . ) : 记 录 跟 踪 消 息
node.on ( . . ) : 注 册 一 个 事 件 处 理 函 数
node.status ( . . ) : 更 新 节 点 的 状 态
node.send ( . . ) : 发 送 消 息

2.2 使用 send 发送数据

  • 在实验四中,我们已经可以使用函数简单判断字符串的走向,但如果使用 if-else 的判断当字符串满足其中一个条件就输出对应的口,但是当某个字符串既满足条件 1 又满足条件 3 的情况下,条件 3 就不会执行。


  • 有没有既可以发送数据,又不会结束函数的方法?当然有。我们查询了节点可以调用的 API,发现有send 函数,满足我们的要求。可以将判断节点做如下的修改:



    该修改首先是放弃了 if-else 的写法,而使用了 if 的写法,使用 node.send 往下一个流发送数据。然后部署并观察现象,可以发现,当点击 apple 的输入按钮时,OUT1 与 OUT3 都可以收到消息。


实现
1.按照上图,拖拽节点,效果如下图
2.设置节点参数

设置第一个节点的参数设置,剩余的2个,重复以下操作




设置函数节点配置



设置函数节点代码
if (msg.topic ==="apple") 
{
    node.send([msg, null, null]);
}
if (msg.topic === "banana") 
{
    node.send([null, msg, null]);
}
if (msg.topic.indexOf("e") != -1) 
{
    node.send([null, null, msg]);
}

把所有的节点连接起来


3.部署查看效果

2.3 流程之间传递函数

  • Context 元素除了可以传递变量以外,也可以传递函数。我们在流 1 中新建一个名为 hello 的函数,在流 2 中调用它。总体部署如下:


  • 第一个流中的 function 节点写法:


  • 第二个流中的 function 节点写法,调用第一个流的中的函数:


  • 注意: 第二个节点可以调用第一个节点的函数,是因为第一个节点创建的函数已经保存到了全局变量 global 里。部署后,先点击 IN1 的输入按钮,再点击 IN2 的输入按钮,可以看到 OUT2 中打印出了 helloworld,其中的“hello”是通过调用流 1 的 hello() 函数打印出来的,说明实验成功了。
实现
1.按照上图拖拽节点,并连接,如下图
2.设置节点代码

设置第一个节点代码

context.global.hello = function () { return "hello" };
msg.payload = context.global.hello();
return msg;

设置第二个节点代码

msg.payload = context.global.hello()+"World";
return msg;
3.部署,查看效果

2.4 使用状态标识

delay 节点用于产生一个随机数,在运行的时候显示出了一个表示时间的字符,显示这个随机的时间是多少,这个功能很直观的可以显示出我们感兴趣的一些数据或状态,可以省去到处用 debug 节点打印的烦恼。我们也可以使用 node.status 来更新节点的状态.

  • step1: 搭建 flow 首先要搭建一个可变的输入信息,并且要持续一段时间,避免状态变得太快看不到。用函数节点 +delay 节点可以实现。先拖拽节点,形成数据流。
  • step2: 第一个节点用于发送 5 个数字:
  • step3: 延时节点设置为每秒只接收一个字符信息:
  • step4: 第二个节点显示节点信息:
实现
1.按照上图,拖拽节点并连接
2.设计节点函数

设置第一个函数节点

for (var i = 0; i < 5; i++) 
{
    node.send({ payload: i });
}
return null;

设置延时节点参数



设置第二个函数节点

node.status
(
    {
        fill: "green", 
        shape: "dot",text: "Received " + msg.payload 
    }
);
return msg;
  • step5: 部署,运行,查看效果

3. 全部代码

[
    {
        "id": "fd24dd19e0ab88ca",
        "type": "tab",
        "label": "流程 5",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "bbdf1e33d3b2040c",
        "type": "inject",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "apple",
        "payload": "apple",
        "payloadType": "str",
        "x": 90,
        "y": 100,
        "wires": [
            [
                "e5f5bc529125975f"
            ]
        ]
    },
    {
        "id": "db1fec6ee1aa2c71",
        "type": "inject",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "banana",
        "payload": "banana",
        "payloadType": "str",
        "x": 100,
        "y": 160,
        "wires": [
            [
                "e5f5bc529125975f"
            ]
        ]
    },
    {
        "id": "98fbcf4584a2f73f",
        "type": "inject",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "orange",
        "payload": "orange",
        "payloadType": "str",
        "x": 100,
        "y": 220,
        "wires": [
            [
                "e5f5bc529125975f"
            ]
        ]
    },
    {
        "id": "e5f5bc529125975f",
        "type": "function",
        "z": "fd24dd19e0ab88ca",
        "name": "function 13",
        "func": "if (msg.topic === \"apple\") \n{\n    node.send([msg, null, null]);\n}\nif (msg.topic === \"banana\") \n{\n    node.send([null, msg, null]);\n}\nif (msg.topic.indexOf(\"e\") != -1) \n{\n    node.send([null, null, msg]);\n}\n",
        "outputs": 3,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 290,
        "y": 160,
        "wires": [
            [
                "e0df73d7264cf691"
            ],
            [
                "db705ff2959f7d84"
            ],
            [
                "975fc285f54b1bfa"
            ]
        ]
    },
    {
        "id": "e0df73d7264cf691",
        "type": "debug",
        "z": "fd24dd19e0ab88ca",
        "name": "debug 24",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "payload",
        "targetType": "msg",
        "statusVal": "",
        "statusType": "auto",
        "x": 460,
        "y": 100,
        "wires": []
    },
    {
        "id": "db705ff2959f7d84",
        "type": "debug",
        "z": "fd24dd19e0ab88ca",
        "name": "debug 25",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 460,
        "y": 160,
        "wires": []
    },
    {
        "id": "975fc285f54b1bfa",
        "type": "debug",
        "z": "fd24dd19e0ab88ca",
        "name": "debug 26",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 480,
        "y": 220,
        "wires": []
    },
    {
        "id": "cfde4bc22548a5da",
        "type": "inject",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 130,
        "y": 360,
        "wires": [
            [
                "833d9441148aa8b0"
            ]
        ]
    },
    {
        "id": "833d9441148aa8b0",
        "type": "function",
        "z": "fd24dd19e0ab88ca",
        "name": "function 14",
        "func": "context.global.hello = function () { return \"hello\" };\nmsg.payload = context.global.hello();\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 290,
        "y": 360,
        "wires": [
            [
                "02d01bfca0ec64bb"
            ]
        ]
    },
    {
        "id": "02d01bfca0ec64bb",
        "type": "debug",
        "z": "fd24dd19e0ab88ca",
        "name": "debug 27",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 500,
        "y": 360,
        "wires": []
    },
    {
        "id": "d0896441365092f6",
        "type": "inject",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 130,
        "y": 440,
        "wires": [
            [
                "7162a1b78eacc220"
            ]
        ]
    },
    {
        "id": "7162a1b78eacc220",
        "type": "function",
        "z": "fd24dd19e0ab88ca",
        "name": "function 15",
        "func": "msg.payload = context.global.hello()+\"World\";\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 290,
        "y": 440,
        "wires": [
            [
                "7e957b78d99d7970"
            ]
        ]
    },
    {
        "id": "7e957b78d99d7970",
        "type": "debug",
        "z": "fd24dd19e0ab88ca",
        "name": "debug 28",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 500,
        "y": 440,
        "wires": []
    },
    {
        "id": "ca10b10e2b9597b1",
        "type": "inject",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "",
        "once": false,
        "onceDelay": 0.1,
        "topic": "",
        "payload": "",
        "payloadType": "date",
        "x": 130,
        "y": 620,
        "wires": [
            [
                "84f68edfbbf9836a"
            ]
        ]
    },
    {
        "id": "84f68edfbbf9836a",
        "type": "function",
        "z": "fd24dd19e0ab88ca",
        "name": "function 16",
        "func": "for (var i = 0; i < 5; i++) \n{\n    node.send({ payload: i });\n}\nreturn null;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 130,
        "y": 700,
        "wires": [
            [
                "8e34506111ecdc36"
            ]
        ]
    },
    {
        "id": "8e34506111ecdc36",
        "type": "delay",
        "z": "fd24dd19e0ab88ca",
        "name": "",
        "pauseType": "rate",
        "timeout": "5",
        "timeoutUnits": "seconds",
        "rate": "1",
        "nbRateUnits": "1",
        "rateUnits": "second",
        "randomFirst": "1",
        "randomLast": "5",
        "randomUnits": "seconds",
        "drop": false,
        "allowrate": false,
        "outputs": 1,
        "x": 150,
        "y": 780,
        "wires": [
            [
                "ea85e1d28efac455"
            ]
        ]
    },
    {
        "id": "ea85e1d28efac455",
        "type": "function",
        "z": "fd24dd19e0ab88ca",
        "name": "function 17",
        "func": "node.status\n(\n    {\n        fill: \"green\", \n        shape: \"dot\",text: \"Received \" + msg.payload \n    }\n);\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 150,
        "y": 860,
        "wires": [
            [
                "2902fbb971fd1fb8"
            ]
        ]
    },
    {
        "id": "2902fbb971fd1fb8",
        "type": "debug",
        "z": "fd24dd19e0ab88ca",
        "name": "debug 29",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 140,
        "y": 940,
        "wires": []
    }
]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容