节点 .js
文件定义了节点的运行时行为。
节点由一个构造函数定义,该函数可用于创建节点的新实例。该函数在运行时注册,以便在流中部署相应类型的节点时可以调用。
该函数会接收一个包含在流程编辑器中设置的属性的对象。
它首先要做的是调用 RED.nodes.createNode
函数来初始化所有节点共享的特性。之后,节点特定的代码就可以编写。
function SampleNode(config) {
RED.nodes.createNode(this,config);
// 节点特定的代码在这里
}
RED.nodes.registerType("sample",SampleNode);
节点在 input
事件上注册一个监听器,以接收来自流中上游节点的消息。
从 Node-RED 1.0 开始,引入了新的监听器样式,允许节点在完成处理消息时通知运行时。这向监听器函数添加了两个新参数。需要小心以确保节点仍然可以安装在不使用这种新样式的 Node-RED 0.x 中。
this.on('input', function(msg, send, done) {
// 处理 'msg' 的逻辑
// 一旦完成,调用 'done'。
// 这个调用被包装在一个检查 'done' 是否存在的逻辑中,
// 因此该节点将在早期版本的 Node-RED 中工作 (<1.0)
if (done) {
done();
}
});
如果节点在处理消息时遇到错误,它应该将错误的详细信息传递给 done
函数。
这将触发同一标签页上存在的任何 Catch 节点,允许用户构建流来处理错误。
同样,如果节点安装在不提供 done
函数的 Node-RED 0.x 中,则需要谨慎处理。在这种情况下,应该使用 node.error
:
let node = this;
this.on('input', function(msg, send, done) {
// 处理 'msg' 的逻辑
// 如果遇到错误,将其报告给运行时
if (err) {
if (done) {
// 与 Node-RED 1.0 兼容
done(err);
} else {
// 与 Node-RED 0.x 兼容
node.error(err, msg);
}
}
});
如果节点处于流的开始位置并对外部事件产生消息,它应该在 Node 对象上使用 send
函数:
var msg = { payload:"hi" }
this.send(msg);
如果节点希望在 input
事件监听器内部响应收到消息时发送,它应该使用传递给监听器函数的 send
函数:
let node = this;
this.on('input', function(msg, send, done) {
// 为了最大程度地向后兼容,检查 send 是否存在。
// 如果该节点安装在 Node-RED 0.x 中,它需要
// 回退使用 `node.send`
send = send || function() { node.send.apply(node,arguments) }
msg.payload = "hi";
send(msg);
if (done) {
done();
}
});
如果 msg
为 null,则不发送消息。
如果节点是在收到消息后发送消息,则应重用收到的消息,而不是创建一个新的消息对象。这确保了消息中现有属性在整个流中的保留。
如果节点有多个输出,可以将一组消息传递给 send
,每个消息将被发送到对应的输出。
this.send([ msg1 , msg2 ]);
可以通过在该数组中传递一组消息来向特定输出发送多个消息:
this.send([ [msgA1 , msgA2 , msgA3] , msg2 ]);
每当部署新的流程时,现有节点将被删除。如果它们在此发生时需要整理状态,例如与远程系统断开连接,它们应在 close
事件上注册一个监听器。
this.on('close', function() {
// 整理任何状态
});
如果节点需要执行任何异步工作以完成整理,注册的监听器应接受一个参数,这是一个函数,当所有工作完成时调用。
this.on('close', function(done) {
doSomethingWithACallback(function() {
done();
});
});
自 Node-RED 0.17 起
如果注册的监听器接受两个参数,第一个将是一个布尔标志,指示节点是否因为被完全移除而关闭,或者它只是被重新启动。如果节点被禁用,它也将被设置为 true。
this.on('close', function(removed, done) {
if (removed) {
// 该节点已被禁用/删除
} else {
// 该节点正在重新启动
}
done();
});
自 Node-RED 0.17 起
在 Node-RED 0.17 之前,运行时会无限期等待 done
函数被调用。如果一个节点未能调用它,这将导致运行时挂起。
在 0.17 及之后的版本中,如果节点花费超过 15 秒,运行时将超时该节点。将记录错误,运行时将继续操作。
如果一个节点需要记录某些内容到控制台,它可以使用以下函数之一:
this.log("发生了某事");
this.warn("发生了你应该知道的事情");
this.error("哦,不,发生了不好的事情");
// 自 Node-RED 0.17 起
this.trace("记录一些正常操作中不需要的内部细节");
this.debug("记录一些更详细信息以调试节点的行为");
warn
和 error
消息也会发送到流程编辑器的调试标签页。
在运行过程中,节点能够与编辑器 UI 共享状态信息。这是通过调用 status
函数实现的:
this.status({fill:"red",shape:"ring",text:"disconnected"});
状态 API 的详细信息可以在 这里 找到。
一个节点可能希望在用户的 settings.js
文件中公开配置选项。
任何设置的名称必须遵循以下要求:
例如,如果节点类型 sample-node
希望公开名为 colour
的设置,则设置名称应为 sampleNodeColour
。
在运行时,节点可以引用该设置为 RED.settings.sampleNodeColour
。
自 Node-RED 0.17 起
在某些情况下,节点可能希望向编辑器公开设置的值。如果是这样,则节点必须在调用 registerType
时注册该设置:
RED.nodes.registerType("sample",SampleNode, {
settings: {
sampleNodeColour: {
value: "red",
exportable: true
}
}
});
value
字段指定设置的默认值。exportable
告诉运行时使设置可用于编辑器。与运行时一样,节点在编辑器中也可以引用该设置为 RED.settings.sampleNodeColour
。
如果节点尝试注册不符合命名要求的设置,将记录错误。
版权所有 OpenJS Foundation 和 Node-RED 贡献者。保留所有权利。OpenJS Foundation 拥有并使用注册商标。有关 OpenJS Foundation 的商标列表,请参阅我们的 商标政策 和 商标列表。未在 OpenJS Foundation 商标列表 中列出的商标和徽标是其各自持有者的商标™或注册商标®。使用它们并不意味着与它们有任何关联或认可。
OpenJS Foundation | 使用条款 | 隐私政策 | OpenJS Foundation 章程 | 商标政策 | 商标列表 | Cookie 政策