在 node-red 中并发访问 msg/payload 的拆分流?

Concurrent access to msg/payload on split flows in node-red?

我正在处理节点红色流并遇到了一些(希望不是真实的)并发问题。

我有一个节点输出 msg.payload,它在一个连接上被写入数据库。数据库插入节点是死胡同,因此来自第一个输出节点的另一个连接转到功能节点,该节点再次覆盖 msg.payload,需要 HTTP 回复。

我想知道在这种情况下的执行顺序,或者更确切地说,当它在功能节点之后运行时,防止数据库访问修改后的 msg.payload。

显然这似乎可行 - 但我想知道这是否只是偶然,还是在每个函数之前或在多个输出上克隆了 msg 对象?

没有并发问题,因为 Node-RED 完全是单线程的(所有 NodeJS 应用程序也是如此),因此在任何给定时间实际上只能执行分支流的一个分支。

流程执行分支顺序按照节点添加到流程的顺序,因此假设节点按顺序添加 A、B、C、D、E

A ----> B ---> D ---> E
    |
    --> C

消息将从 A 传送到 B 到 D 到 E,然后再传送到 C(假设 B、D、E 的 none 块用于 io)

当有多个节点连接到单个输出时也会克隆消息,您可以使用以下流程轻松测试它:

[{"id":"9fd37544.36664","type":"inject","z":"8b231c78.b8edc8","name":"","topic":"","payload":"foo","payloadType":"str","repeat":"","crontab":"","once":false,"x":269.5,"y":284.25,"wires":[["48eda9a0.b455e8","e1f3c665.9af04"]]},{"id":"48eda9a0.b455e8","type":"function","z":"8b231c78.b8edc8","name":"","func":"msg.payload = \"bar\";\nreturn msg;","outputs":1,"noerr":0,"x":454.5,"y":283.75,"wires":[["5f27ffc7.a54ce"]]},{"id":"5f27ffc7.a54ce","type":"debug","z":"8b231c78.b8edc8","name":"","active":true,"console":"false","complete":"false","x":635.5,"y":284.5,"wires":[]},{"id":"e1f3c665.9af04","type":"debug","z":"8b231c78.b8edc8","name":"","active":true,"console":"false","complete":"false","x":475.5,"y":362.5,"wires":[]}]

它有一个流向 2 个调试输出的输入,第一个分支包含一个函数节点,它在输出之前修改有效负载。