NodeRed 从先前节点输出的 msg 有效负载填充节点表单

NodeRed populate node form from msg payload from previous node output

我有几个自定义节点可以连接到 Web 服务以使用原子 ID 提取数据。我想用一个节点拉入所有项目(json 有效载荷数组),添加到 msg 有效载荷并使用该有效载荷 .on("input") 填充 html 中的配置表单第二个节点。

module.export = (RED) => {
    let data = [];
    const getAllNode = () => {
       // promised data returned 
       data = service.getAllData(config);
       let node = this;
        RED.nodes.createNode(node, config);

        node.on('input', (msg) => {
             // simple pseudo but this part works fine
             msg.payload = data;

             node.send(msg);
        })
    }

    RED.nodes.registerType("get-all", getAllNode);
}

根据 msg.payload 属性 设置数据,类似这样

[
     { first: "Bob", last: "Smith", age: 45, id: 241 },
     { first: "Karen", last: "NotThatKaren", age: 32, id: 112 },
     { first: "Latisha", last: "Rhodes", age: 41, id: 742 }
]

在下一个节点中,我想设置 html(如果可能的话),它会显示一个 select 框,其中只有名字是基于进入其中的 msg 有效负载。 ....是否可以在 .on("input") 收到消息时动态更改 html?

<script type="text/html" data-template-name="some-binding">
    template something here based on a template/data binding??
</script>

不,您不能根据前面节点的输入更改显示的设置。

此外,每个节点配置都应独立于任何其他节点,但它们可以共享配置节点。节点不需要知道流中的哪些节点 preceed/postceed(诸如 http-in/http-out 通过将响应对象附加到 msg 来解决这个问题)

你要明白节点的2个部分(HTML, JS)是完全独立的。 HTML部分运行在浏览器中,JS部分运行在后端。后端无权访问 HTML 部分。

同样值得记住的是,如果你从一个空白 canvas 开始并添加你的第一个节点,然后添加第二个节点并将它们连接在一起,在你点击部署之前它们之间不会有任何消息传递,所以会有第一个节点无法填充第二个节点。

虽然您可以选择使用附加到消息的数据覆盖 HTML 中输入的设置,但无法将此数据保存到流的已保存状态。

如果您的节点配置依赖于某些后端系统,那么您可以从 HTML 部分中发出 HTTP 请求以请求每个节点的数据,您可以在 onEditPrepare 回调,或者您可以将事件处理程序附加到 HTML 表单中的项目以按需执行此操作,例如到按钮。如果需要,您可以将 HTTP 路由添加到可以从 HTTP 调用的 JS 文件,以解决跨站点访问问题。以串行端口核心节点为例。