How to reference context based on topic (without using function node)?


Basically I'm wondering if there's a way to do the equivalent of flow.set(msg.topic,"foo"); in a Change node and switch(flow.get(msg.topic)) in a Switch. I've tried variations of $(x) , $.x , {{x}}, and [x] with no luck.

Note that I am not trying to save the topic to I'm trying to save "foo" to flow.[msg.topic]

Ultimately it doesn't matter since I can just use a function, but it seems like it would be a common-enough use case for the basic nodes to handle.



I don't think there is.

It would require some kind of "templating" in common input fields much like we currently get for environment variables.



I only was able to workout a partial workaround solution.

In this example flow it is injected:

msg.payload = foo
msg.topic  = alarm

The change node uses a jsonata expression to create the object {alarm : msg.payload} and have it stored in flow.sta

The function node will read to the object msg the object flow.sta


[{"id":"35baa7cd.9b2f08","type":"tab","label":"Flow 4","disabled":false,"info":""},{"id":"5ae8597e.4bdc08","type":"debug","z":"35baa7cd.9b2f08","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","x":690,"y":120,"wires":[]},{"id":"42343f37.f095a","type":"inject","z":"35baa7cd.9b2f08","name":"","topic":"alarm","payload":"foo","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":120,"wires":[["df81e676.991df8"]]},{"id":"df81e676.991df8","type":"change","z":"35baa7cd.9b2f08","name":"","rules":[{"t":"set","p":"#:(memoryOnly)::sta","pt":"flow","to":"$.{topic : payload}","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":350,"y":120,"wires":[["f7335a43.eb7498"]]},{"id":"f7335a43.eb7498","type":"function","z":"35baa7cd.9b2f08","name":"read flow.sta","func":"\nmsg = flow.get(\"sta\",\"memoryOnly\");\nreturn msg;","outputs":1,"noerr":0,"x":520,"y":120,"wires":[["5ae8597e.4bdc08"]]}]


1 Like


Haha, I wondered if someone would come up with that. I decided not to include it since the Riven5 was looking for something simpler than a function node and the danger with JSONata (though I like it) is that it can be hard to parse 6 months down the line. :slight_smile:



That's an interesting solution I hadn't considered. I agree with @TotallyInformation that it could be confusing 6 months later, but it does the trick in a one-liner, seems to work fine with a variety of nodes, and I can retrieve it at the other end with $flowContext('sta.'&topic) . I'm going to go ahead and mark this solved. Thanks.



Slight revision. Since this is setting the whole object each time, it overwrites any other topics that have been previously saved. Need to do this instead:

$merge([$flowContext("sta"),{$.topic: payload}]) 

At which point I'm leaning towards just returning to the original function.