如何以不一次发送所有消息的方式自定义 Node-Red 中的拆分节点?
How to customize the Split node in Node-Red in a way not to send all msgs at once?
我正在尝试自定义 Node-Red 中的 Split 节点,使其仅在第一条消息到达 Join 节点时才发送下一条消息;因为我在两者之间进行一些处理,并且想在加入它们之前分别处理每个消息。
所以我从 Node-Red 项目中克隆了 Split 节点,在数组拆分发生的部分;我注册事件的监听器(由原始 Split 节点生成的随机 ID)。
else if (Array.isArray(msg.payload)) { // then split array into messages
msg.parts.type = 'array';
var count = msg.payload.length / node.arraySplt;
if (Math.floor(count) !== count) {
count = Math.ceil(count);
}
msg.parts.count = count;
var pos = 0;
var data = msg.payload;
msg.parts.len = node.arraySplt;
for (let i = 0; i < count; i++) {
msg.payload = data.slice(pos, pos + node.arraySplt);
if (node.arraySplt === 1) {
msg.payload = msg.payload[0];
}
msg.parts.index = i;
pos += node.arraySplt;
if (i === 0) {
send(RED.util.cloneMessage(msg));
continue;
}
let eventName = msg.parts.id + '-' + i;
addHandler(eventName, send, msg);
}
done();
}
我的处理函数
function addHandler(eventName, send, msg) {
RED.events.addListener(eventName, () => {
send(RED.util.cloneMessage(msg));
});
}
并且在 Join 节点(在同一个 js 文件中)
// commented below is the original code of the join function
// if ((tcnt > 0 && group.currentCount > tcnt) || msg.hasOwnProperty('complete')) {
// completeSend(partId);
// return;
// } else
if (msg.parts.index <= (msg.parts.count - 2)) {
let eventName = msg.parts.id + '-' + (parseInt(msg.parts.index) + 1);
RED.events.emit(eventName);
} else if (msg.parts.index >= (msg.parts.count - 1)) {
completeSend(partId);
return;
}
然而,这将发送第一条消息(因为我直接发送它,而不是通过事件),并且只发送最后一条消息;它会跳过中间的任何内容。
修改拆分节点是错误的做法。
有速率限制节点可以为您执行此操作。例如https://flows.nodered.org/node/node-red-contrib-semaphore
或者你可以使用具有释放功能的延迟节点
我正在尝试自定义 Node-Red 中的 Split 节点,使其仅在第一条消息到达 Join 节点时才发送下一条消息;因为我在两者之间进行一些处理,并且想在加入它们之前分别处理每个消息。
所以我从 Node-Red 项目中克隆了 Split 节点,在数组拆分发生的部分;我注册事件的监听器(由原始 Split 节点生成的随机 ID)。
else if (Array.isArray(msg.payload)) { // then split array into messages
msg.parts.type = 'array';
var count = msg.payload.length / node.arraySplt;
if (Math.floor(count) !== count) {
count = Math.ceil(count);
}
msg.parts.count = count;
var pos = 0;
var data = msg.payload;
msg.parts.len = node.arraySplt;
for (let i = 0; i < count; i++) {
msg.payload = data.slice(pos, pos + node.arraySplt);
if (node.arraySplt === 1) {
msg.payload = msg.payload[0];
}
msg.parts.index = i;
pos += node.arraySplt;
if (i === 0) {
send(RED.util.cloneMessage(msg));
continue;
}
let eventName = msg.parts.id + '-' + i;
addHandler(eventName, send, msg);
}
done();
}
我的处理函数
function addHandler(eventName, send, msg) {
RED.events.addListener(eventName, () => {
send(RED.util.cloneMessage(msg));
});
}
并且在 Join 节点(在同一个 js 文件中)
// commented below is the original code of the join function
// if ((tcnt > 0 && group.currentCount > tcnt) || msg.hasOwnProperty('complete')) {
// completeSend(partId);
// return;
// } else
if (msg.parts.index <= (msg.parts.count - 2)) {
let eventName = msg.parts.id + '-' + (parseInt(msg.parts.index) + 1);
RED.events.emit(eventName);
} else if (msg.parts.index >= (msg.parts.count - 1)) {
completeSend(partId);
return;
}
然而,这将发送第一条消息(因为我直接发送它,而不是通过事件),并且只发送最后一条消息;它会跳过中间的任何内容。
修改拆分节点是错误的做法。
有速率限制节点可以为您执行此操作。例如https://flows.nodered.org/node/node-red-contrib-semaphore
或者你可以使用具有释放功能的延迟节点