配置节点

有些节点需要共享配置。例如,MQTT 输入节点和 MQTT 输出节点共享 MQTT 代理的配置,从而允许它们共享连接。配置节点默认是在全局作用域中,这意味着状态将在流之间共享。

定义一个配置节点

配置节点的定义方式与其他节点相同。主要有两个关键区别:

  1. category 属性设置为 config
  2. 编辑模板中的 <input> 元素的 id 为 node-config-input-<propertyname>

remote-server.html

<script type="text/javascript">
    RED.nodes.registerType('remote-server',{
        category: 'config',
        defaults: {
            host: {value:"localhost",required:true},
            port: {value:1234,required:true,validate:RED.validators.number()},
        },
        label: function() {
            return this.host+":"+this.port;
        }
    });
</script>

<script type="text/html" data-template-name="remote-server">
    <div class="form-row">
        <label for="node-config-input-host"><i class="fa fa-bookmark"></i> 主机</label>
        <input type="text" id="node-config-input-host">
    </div>
    <div class="form-row">
        <label for="node-config-input-port"><i class="fa fa-bookmark"></i> 端口</label>
        <input type="text" id="node-config-input-port">
    </div>
</script>

remote-server.js

module.exports = function(RED) {
    function RemoteServerNode(n) {
        RED.nodes.createNode(this,n);
        this.host = n.host;
        this.port = n.port;
    }
    RED.nodes.registerType("remote-server",RemoteServerNode);
}

在这个示例中,节点充当配置的简单容器——它没有实际的运行时行为。

配置节点的一个常见用法是表示与远程系统的共享连接。在这种情况下,配置节点可能还负责创建连接并将其提供给使用该配置节点的节点。在这种情况下,配置节点还应该处理 close 事件,以便在节点停止时断开连接。

使用配置节点

节点通过在 defaults 数组中添加一个属性,type 属性设置为配置节点的类型,来注册对配置节点的使用。

defaults: {
   server: {value:"", type:"remote-server"},
},

与其他属性一样,编辑器会在编辑模板中查找 id 为 node-input-<propertyname><input> 元素。与其他属性不同的是,编辑器会将这个 <input> 元素替换为一个用可用配置节点实例填充的 <select> 元素,并提供一个按钮以打开配置节点的编辑对话框。

然后,节点可以使用此属性在运行时访问配置节点。

module.exports = function(RED) {
    function MyNode(config) {
        RED.nodes.createNode(this,config);

        // 获取配置节点
        this.server = RED.nodes.getNode(config.server);

        if (this.server) {
            // 使用:
            //  this.server.host
            //  this.server.port
        } else {
            // 未配置配置节点
        }
    }
    RED.nodes.registerType("my-node",MyNode);
}