首页 > 解决方案 > 如何在 NodeRED 中创建自定义注入节点?

问题描述

我想通过单击按钮来启动我的节点,这样我就不必将注入节点放在前面。那怎么可能在javascript文件中注册一个按钮点击?

我试图放入node.on("input", async function(msg){/*some code*/})我注册节点的 javascript 文件中。我可以通过这个添加这个按钮在此处输入图像描述

//HTML file script
<script type="text/javascript">
  RED.nodes.registerType('light', {
    category: "input",
    color: "#f3c12b",
    defaults: {
      name: {value: ""},
      plus: {value: ""},

      topic: {value: this.name},
      payload: {value: ""}
    },
    inputs: 0,
    outputs: 1,
    label: function(){
      return "Licht '"+this.name+"'" || "Licht";
    },
    button: {
      enabled: function(){
        return true;
      },
      onclick: function(){
         //I´ve put the code here, but then I have to reconfigure my functions
      }
    }
  });
</script>

//Javascript file --> register function
//Not getting any response
node.on("input", async function(msg) {
    msg = {};
    msg.topic = this.topic;
    msg.payload = "This is a new message!";

    node.send(msg);
});

我期待,当我单击此节点时,节点正在发送消息,但节点没有响应任何内容。

标签: javascriptnode.jsnode-red

解决方案


最好的办法是查看注入节点源代码。 注入.html 注入 .js

在注入节点的情况下,HTML 文件中按钮参数的 onclick 函数实际上是/inject/{id}在服务器上进行 POST 调用。

onclick: function() {
            
    ...

    var node = this;
    $.ajax({
        url: "inject/"+this.id,
        type:"POST",
        success: function(resp) { ... }
    });

}

在服务器上运行的注入 JS 文件托管一个 http 端点/inject/:id,当它被调用时,它通过 id 获取节点并被调用node.receive(),它充当其输入的触发器。

module.exports = function(RED) {

    ...

    RED.httpAdmin.post("/inject/:id", RED.auth.needsPermission("inject.write"), function(req,res) {
        var node = RED.nodes.getNode(req.params.id);

        ...

        node.receive();
        
        ...
    });
}

推荐阅读