我正在处理节点红色流,并遇到了一些(希望不是真正的)并发问题。
我有一个输出msg.payload的节点,它在一个连接上写入数据库。数据库插入节点是死角,因此来自第一个输出节点的另一个连接进入一个函数节点,该节点再次覆盖了HTTP响应所需的msg.payload。
我想知道在这种情况下执行的顺序,或者更确切地说,当它在函数节点之后运行时,防止数据库访问修改后的msg.payload。
显然这似乎有效 - 但我想知道这是不是偶然,或者是在每个函数之前克隆的msg对象,还是多个输出?
答案 0 :(得分:1)
没有并发问题,因为Node-RED完全是单线程的(就像所有NodeJS应用程序一样),因此在任何给定时间只能分支流的一条腿实际执行。
流程执行分支顺序是按节点添加到流中的顺序,因此假设按顺序添加节点A,B,C,D,E
A ----> B ---> D ---> E
|
--> C
消息将从A传送到B到D到E然后传送到C(假设没有B,D,E块用于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个调试输出,第一个分支包括一个功能节点,它在输出之前修改有效载荷。