Node-RED:如何获取msg发送节点?能否在输入事件中检测最后发送节点?
在Node-RED中追踪消息的发送节点
嘿,这个问题问到点子上了!在Node-RED里追踪消息的来源节点其实挺实用的,不管是调试还是做流逻辑判断都能用得上,我来给你详细说说:
一、如何获取msg的发送节点?
有两种常用的方式,看你的需求来选:
1. 利用Node-RED自带的msg._source属性
Node-RED在消息传递时,会自动给msg对象添加一个_source内部属性,里面就包含了发送这个消息的节点的ID和类型。你可以直接在接收节点里读取这个属性:
// 在接收消息的函数节点中,获取发送节点信息 const senderNodeId = msg._source.id; const senderNodeType = msg._source.type; // 打印调试信息 node.warn(`收到来自节点 [ID: ${senderNodeId}](类型:${senderNodeType})的消息`); return msg;
注意:_source是Node-RED的内部属性,如果你手动创建了新的msg对象(比如不是从上游节点传递来的),这个属性可能不存在,需要提前判断。
2. 自定义添加节点标识属性
如果需要更丰富的节点信息(比如节点名称),或者担心内部属性有变动,你可以在上游的发送节点里手动给msg添加自定义属性:
// 在上游发送消息的函数节点中,添加自定义标识 msg.lastSender = { id: node.id, type: node.type, name: node.name || '未命名节点' // 如果节点设置了名称就用,否则显示默认值 }; return msg;
然后在下游接收节点里,直接读取这个自定义属性就能拿到发送节点的信息了:
// 下游节点读取最后发送节点的信息 if (msg.lastSender) { node.info(`最后发送消息的节点是:${msg.lastSender.name}(ID:${msg.lastSender.id})`); } return msg;
二、能不能在输入事件中检测msg对象的最后发送节点?
当然可以!当节点触发input事件(也就是收到消息时),此时msg对象里的_source或者你自定义的lastSender属性,对应的就是最后一个发送这个消息的节点——因为消息是沿着流的方向依次传递的,上一个节点就是最后发送的节点。
举个场景:你有一个开关节点→函数节点→调试节点的流,当调试节点收到消息时,msg._source指向的就是上游的函数节点,而如果你在函数节点里添加了lastSender,调试节点读到的就是函数节点的信息。
如果你的流有分支,只要每个分支的节点都更新自定义的lastSender属性,就能保证在任意节点的输入事件里,拿到的都是当前消息路径上的最后发送节点。
内容的提问来源于stack exchange,提问作者Net_Hans
相关产品推荐
相关产品推荐

