NodeRED:修改 flows.json 后配置丢失

NodeRED: Configuration lost after modifying flows.json

我有一个使用 MQTT 发布者和订阅节点以及一个代理配置的工作流程。一切正常。

在启动 NodeRED 之前,我必须使用环境变量 MQTT_BROKER_IPMQTT_BROKER_PORT.

更改 MQTT 代理 ip 和端口

为此我使用

sed -i -e "s/^\([[:blank:]]*\"broker\":[[:blank:]]*\)\"[^\"]*\",/\"$MQTT_BROKER_IP\",/g" /data/flows.json
sed -i -e "s/^\([[:blank:]]*\"port\":[[:blank:]]*\)\"[^\"]*\",/\"$MQTT_BROKER_PORT\",/g" /data/flows.json

替换有效。

现在的问题是,当 NodeRED 启动时,日志文件中出现错误:

[info] Starting flows
[error] [mqtt out:2b1fba1a.efa24e] missing broker configuration
[error] [mqtt in:58c7bd6b.0e8664] missing broker configuration

当我转到 NodeRED 编辑器时,打开 MQTT 节点,保存它们而不修改任何内容并部署流程,一切正常,MQTT 节点亮起绿色 "connected"。

为什么会这样?我必须如何正确修改 NodeRED 外部的 flows.json?

问题是 json 字段 broker 被流程中的多个条目用于不同的事情。例如

您正在尝试编辑的 mqtt-broker 配置节点:

{
    "id": "c2ba2a60.80ae38",
    "type": "mqtt-broker",
    "z": "",
    "name": "",
    "broker": "192.168.1.116",
    "port": "1883",
    "clientid": "",
    "usetls": false,
    "compatmode": false,
    "keepalive": "60",
    "cleansession": true,
    "birthTopic": "",
    "birthQos": "0",
    "birthPayload": "",
    "closeTopic": "",
    "closeQos": "0",
    "closePayload": "",
    "willTopic": "",
    "willQos": "0",
    "willPayload": ""
  }

mqtt-in 节点:

{
  "id": "98d0e95b.c28c2",
  "type": "mqtt in",
  "z": "a4de5120.cd3f58",
  "name": "",
  "topic": "#",
  "qos": "0",
  "datatype": "auto",
  "broker": "c2ba2a60.80ae38",
  "x": 190,
  "y": 80,
  "wires": [
    []
  ]
}

如您所见,当您 运行 您的 sed 脚本时,它也会更改 broker mqtt-in 节点中指向 mqtt-broker 的条目。

open/save 可能有效,因为您只定义了一个 mqtt-broker,因此它将默认在列表中被选中,因此在您部署时修复该条目。

如果你想做这种事情,你需要更复杂的东西,它知道它正在更新的每个 JSON 条目中的 type 条目。