节点.js
文件定义了节点的运行时行为。
节点由一个构造函数定义,该函数可用于创建节点的新实例。该函数在运行时注册,以便在流程中部署相应类型的节点时可以调用。
该函数接收一个包含流程编辑器中设置的属性的对象。
首先必须调用RED.nodes.createNode
函数来初始化所有节点共享的功能特性。之后才是节点特定的代码部分。
function SampleNode(config) {
RED.nodes.createNode(this,config);
// node-specific code goes here
}
RED.nodes.registerType("sample",SampleNode);
节点在input
事件上注册监听器,用于接收来自流程中上游节点的消息。
在Node-RED 1.0版本中,引入了一种新型的监听器,允许节点在处理完消息后通知运行时环境。这为监听器函数新增了两个参数。需要注意确保该节点仍可安装在未使用这种新型监听器的Node-RED 0.x版本中。
this.on('input', function(msg, send, done) {
// do something with 'msg'
// Once finished, call 'done'.
// This call is wrapped in a check that 'done' exists
// so the node will work in earlier versions of Node-RED (<1.0)
if (done) {
done();
}
});
如果节点在处理消息时遇到错误,应将错误详情传递给done
函数。
这将触发同一标签页上的所有Catch节点,允许用户构建流程来处理错误。
再次提醒,如果节点安装在Node-RED 0.x版本中需要特别注意,该版本不提供done
函数。这种情况下,应该使用node.error
:
let node = this;
this.on('input', function(msg, send, done) {
// do something with 'msg'
// If an error is hit, report it to the runtime
if (err) {
if (done) {
// Node-RED 1.0 compatible
done(err);
} else {
// Node-RED 0.x compatible
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) {
// For maximum backwards compatibility, check that send exists.
// If this node is installed in Node-RED 0.x, it will need to
// fallback to using `node.send`
send = send || function() { node.send.apply(node,arguments) }
msg.payload = "hi";
send(msg);
if (done) {
done();
}
});
如果msg
为空,则不发送任何消息。
如果节点在收到消息后需要发送响应消息,它应当重用接收到的消息而非创建新的消息对象。这样可以确保消息上的现有属性在流程的后续部分得以保留。
如果节点有多个输出,可以将消息数组传递给send
,每条消息会被发送到对应的输出端口。
this.send([ msg1 , msg2 ]);
可以通过在此数组中传递消息数组,向特定输出发送多条消息:
this.send([ [msgA1 , msgA2 , msgA3] , msg2 ]);
每当部署新流程时,现有节点会被删除。如果任何节点需要在此情况下清理状态(例如断开与远程系统的连接),它们应该在close
事件上注册监听器。
this.on('close', function() {
// tidy up any state
});
如果节点需要执行任何异步工作来完成清理,已注册的监听器应接受一个参数,该参数是一个在所有工作完成时将被调用的函数。
this.on('close', function(done) {
doSomethingWithACallback(function() {
done();
});
});
自 Node-RED 0.17 版本起
如果注册的监听器接受两个参数,第一个将是一个布尔标志,表示节点是否因为被完全移除而关闭,或者只是正在重启。如果节点已被禁用,该标志也会被设置为true。
this.on('close', function(removed, done) {
if (removed) {
// This node has been disabled/deleted
} else {
// This node is being restarted
}
done();
});
自 Node-RED 0.17 版本起
在Node-RED 0.17版本之前,运行时会无限期等待done
函数被调用。如果某个节点未能调用它,将导致运行时挂起。
在0.17及更高版本中,如果节点运行时间超过15秒,运行时将使其超时。将记录错误并且运行时将继续运行。
如果节点需要向控制台输出日志信息,可以使用以下函数之一:
this.log("Something happened");
this.warn("Something happened you should know about");
this.error("Oh no, something bad happened");
// Since Node-RED 0.17
this.trace("Log some internal detail not needed for normal operation");
this.debug("Log something more details for debugging the node's behaviour");
warn
和 error
消息也会发送到流程编辑器的调试选项卡。
在运行时,节点能够与编辑器界面共享状态信息。这是通过调用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
来引用该设置。
如果节点尝试注册不符合命名要求的设置,将会记录错误日志。
Node-RED: 面向事件驱动应用的低代码编程平台。
版权所有 OpenJS基金会 及 Node-RED 贡献者。保留所有权利。OpenJS基金会 拥有注册商标并使用商标。有关 OpenJS基金会 的商标列表,请参阅我们的 商标政策 和 商标列表。未在 OpenJS基金会商标列表 中标注的商标™或注册®商标归其各自持有人所有。使用这些商标并不意味着与它们有任何关联或获得其认可。
The OpenJS Foundation | 使用条款 | 隐私政策 | OpenJS基金会章程 | 商标政策 | 商标列表 | Cookie政策