在流程控制中,经常会碰到异步方式对结果进行确认,如果出错的情况下进行重试,这篇文章结合具体的示例对trigger在Node-RED中流程编辑的方式进行进一步说明。
以容器方式启动Node-RED服务,启动命令如下所示:
启动命令:docker run -it -p 1880:1880 -v $PWD/data:/data -e TZ=Asia/Shanghai --name nodered -d nodered/node-red:1.0.4
使用场景:连接性检测场景说明:如果持续能够获取输入的情况下,表明连接是正常的,如果一旦不能有数据过来,可能是硬件传感器的数据没有获取,说明是失败的情况。
trigger节点设定信息详细如下所示:
部署之后,执行结果如下所示
当然也可以将输出进行合并,显示用的输出节点合并之后如下图所示
部署并执行,结果如下所示
上述的示例有一个问题就是一旦出错,不能够持续性地进行提示,再结合一个trigger即可实现常见的retry功能,从而实现一旦停止5s以上不输入就会持续输出信息,如果数据一旦继续输入就会不再提示错误信息的功能。flow信息如下所示
- trigger 5s节点设定信息如下所示
-
retry节点设定如下所示:
部署之后执行结果如下所示:
- JSON格式的flow
[{"id":"d67f423d.4031","type":"inject","z":"73554227.4474dc","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":160,"wires":[["3ddd10ea.96ab3","8a18d983.f05418"]]},{"id":"3ddd10ea.96ab3","type":"debug","z":"73554227.4474dc","name":"正常输出","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":700,"y":160,"wires":[]},{"id":"8a18d983.f05418","type":"trigger","z":"73554227.4474dc","op1":"retry","op2":"true","op1type":"str","op2type":"bool","duration":"5","extend":true,"units":"s","reset":"","bytopic":"all","name":"","x":340,"y":220,"wires":[["fd94e825.30c3f8"]]},{"id":"fd94e825.30c3f8","type":"trigger","z":"73554227.4474dc","op1":"5秒没有动作,请检查硬件","op2":"5秒没有动作,请检查硬件","op1type":"str","op2type":"str","duration":"-5","extend":true,"units":"s","reset":"retry","bytopic":"all","name":"retry","x":510,"y":220,"wires":[["3ddd10ea.96ab3"]]}]总结
在Node-RED中,本例中展示的特性还可以用作异常时的替换,比如正常时传感器以2秒的频率进行数字的更新仪表盘的显示,而一旦硬件出现问题,可以考虑使用这种方式进行异常情况下的数据替代输出,比如显示为0,一旦硬件恢复动作,retry不再执行,而仪表盘的显示也能随之正常。