流程控制-上下文路由
根据上下文值来路由或者阻塞消息
问题背景
想根据另一个变量的当前值做条判断条件,将消息路由到不同的流,或者拦截所有消息。
解决方案
使用 调整消息属性 节点 将切换变量保存到控制流上下文变量中,然后使用 条件分支 节点检查该流上下文属性的值是否与节点配置的不同输出对应的值一致。
示例
示例中使用 注入 和 调整消息属性 节点 模拟上下文值的变化。

示例JSON
[{"id":"a62d8cdf.1bd82","type":"inject","z":"714695530b415411","name":"Inject","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"2","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":210,"y":1500,"wires":[["b8bbbc41.f272"]]},{"id":"b8bbbc41.f272","type":"switch","z":"714695530b415411","name":"基于上下文的 state 值路由","property":"state","propertyType":"flow","rules":[{"t":"eq","v":"1","vt":"num"},{"t":"eq","v":"2","vt":"num"},{"t":"eq","v":"3","vt":"num"}],"checkall":"true","repair":false,"outputs":3,"x":440,"y":1500,"wires":[["9aa9c6b2.18a8e8"],["6ba4ec46.476794"],["a2e806c8.ffa168"]]},{"id":"9aa9c6b2.18a8e8","type":"debug","z":"714695530b415411","logName":"state = 1 时输出","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","logLevel":"info","dataType":"field","syntax":"mustache","template":"","x":740,"y":1440,"wires":[]},{"id":"6ba4ec46.476794","type":"debug","z":"714695530b415411","logName":"state = 2 时输出","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","logLevel":"info","dataType":"field","syntax":"mustache","template":"","x":740,"y":1500,"wires":[]},{"id":"a2e806c8.ffa168","type":"debug","z":"714695530b415411","logName":"state = 3 时输出","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"payload","targetType":"msg","statusVal":"payload","statusType":"auto","logLevel":"info","dataType":"field","syntax":"mustache","template":"","x":740,"y":1560,"wires":[]},{"id":"8aabdb51.e8b538","type":"inject","z":"714695530b415411","name":"设置 state = 0 - 拦截所有消息","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":280,"y":1590,"wires":[["e46083e4.1f17b"]]},{"id":"d1722dee.48db4","type":"inject","z":"714695530b415411","name":"设置 state = 1 - msg发送到 1 输出","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"1","payloadType":"num","x":290,"y":1635,"wires":[["e46083e4.1f17b"]]},{"id":"4bdb08de.706328","type":"inject","z":"714695530b415411","name":"设置 state = 2 - msg发送到 2 输出","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"2","payloadType":"num","x":290,"y":1680,"wires":[["e46083e4.1f17b"]]},{"id":"220ce0a6.cf81e","type":"inject","z":"714695530b415411","name":"设置 state = 3 - msg 发送到 3 输出","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"3","payloadType":"num","x":300,"y":1725,"wires":[["e46083e4.1f17b"]]},{"id":"e46083e4.1f17b","type":"change","z":"714695530b415411","name":"设置 flow.state 值","rules":[{"t":"set","p":"state","pt":"flow","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":1620,"wires":[[]]}]
运行结果
下图中的 inject 节点设置了每隔 3s 发送当前的时间戳到条件处理节点,如下图就是 基于上下文的 state 值路由 节点
点击部署之后,点击下方注入节点设置不同 state 值的按钮,可以看到对应的 日志输出节点下方的数字在跳动,右侧输出窗口输出对应的值,当将 state 设置为 0 的时候,基于上下文的 state 值路由 节点将会拦截 inject 节点发送过来的消息,没有数据发送到 输出端口连接的 日志输出 节点,但是 inject 仍会继续每隔3s生成一条带当前时间戳的消息,要验证这个可以直接在 inject 后面连接一个 日志输出 节点
