Node-red自定义节点,如何使用节点属性?

Node-red custom node, How to use the node property?

我正在尝试创建自定义节点,我正在尝试一个非常简单的节点。我需要使用节点的 属性,用户从下拉列表中选择的值,send/output 属性 和 msg.payload 的值。

这是调试选项卡中的错误消息:

4/7/2017 21.45.06node: lolo
msg : error
"ReferenceError: $ is not defined"

这是期望的输出:

"ppp[lolo:m2]"

我删除了js文件中带$的行,因为它不识别jQuery。我改用这个

msg.payload = msg.payload +"[" + nodeName+":"+ node.axis +"]";

但在输出中选项值未定义,而不是 select 下拉列表中的选项之一的值:

5/7/2017 11.34.22node: 5aa4aa59.f9fa04
msg.payload : string[19]
"ppp[lolo:undefined]"

这是节点的 html 文件:

<script type="text/javascript">
    RED.nodes.registerType('Hello World',{
        category: 'Demo',
        color: '#ffaaaa',
        defaults: {
            name: {value:""},
  axis:{value:""}
        },
        inputs:1,
        outputs:1,
        icon: "face.png",
        label: function() {
            return this.name||"Hello World";
        }
    });
</script>
<script type="text/x-red" data-template-name="Hello World">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
    </div>
    <div class="form-row">
        <label for="node-input-topic"><i class="icon-tag"></i> Topic</label>
        <input type="text" id="node-input-topic" placeholder="Topic">
    </div>
 <div class="form-row">
        <label for="node-input-axis"><i class="icon-tag"></i> Motor</label>
        <!--<input type="text" id="node-input-axis" placeholder="axis">-->
  <select value="" id="node-input-axis" placeholder="axis">
            <option value="m1">m1</option>
            <option value="m2">m2</option>
            <option value="m3">m3</option>
            <option value="m4">m4</option>
        </select>
    </div>
</script>
<script type="text/x-red" data-help-name="Hello World">
    <p>A node that increments every time a new message is received and sends Hello World in return.<br/>
    </p>
</script>

这是节点的 js 文件:

module.exports = function(RED) {
    function helloWorld(config) {
        RED.nodes.createNode(this,config);
        //var context = this.context();
  var nodeName = this.name;
  var axis = config.axis; 
        var node = this;
  //var $ = require('jQuery');
  var x = $("#node-input-axis").val();
        this.on('input', function(msg) {
   msg.payload = msg.payload +"[" + nodeName+":"+ x +"]";
   //{payload: nodeName+" "+node.axis};
   node.send(msg);
        });
  //console.log(value);
    }
    RED.nodes.registerType("Hello World",helloWorld);
};

请务必记住,Node-RED 节点的 2 个独立部分 运行 位于非常不同的位置:

  • .js 文件 运行 在 Node-RED
  • 的后端服务器端
  • Web 浏览器中的 .html 文件 运行 正在访问用户客户端计算机上的 Node-RED 编辑器。

这意味着 .js 文件无法直接访问编辑器配置中的字段 window 并且也无法访问 jquery ($)表示法。

部署流程时,所有配置变量都会在 config 变量中传递到后端。您已经在以下位置访问过该值:

var axis = config.axis; 

所以您可以只使用 axis 变量而不是 var x = $("#node-input-axis").val();

您不能使用 node.axis,因为您在尝试使用之前没有将 config.axis 绑定到 this.axisnode.axis

例如:

module.exports = function(RED) {
    function helloWorld(config) {
        RED.nodes.createNode(this,config);
        //var context = this.context();
        var nodeName = this.name;
        this.axis = config.axis; 
        var node = this;

        this.on('input', function(msg) {
            msg.payload = msg.payload +"[" + nodeName+":"+ node.axis +"]";
            //{payload: nodeName+" "+ node.axis};
            node.send(msg);
        });
        //console.log(value);
    }
    RED.nodes.registerType("Hello World",helloWorld);
};