【问题标题】:Is it possible to declare global variables in Node-RED and use them on the node configuration?是否可以在 Node-RED 中声明全局变量并在节点配置中使用它们?
【发布时间】:2017-06-01 03:53:58
【问题描述】:

假设我正在使用 MQTT 协议从许多设备接收信息,并且下图是一个设备块的简化版本:

所以我们还假设所有其他设备都具有完全相同的图表,除了第二个设备的主题名称将更改为device2,第三个设备将更改为device3,依此类推,如下所示:

问题是我想要一种在节点配置中更改名称的方法,而不必一一进行。就像声明一个不仅可以在函数中使用而且可以在节点本身中使用的全局变量。例如,最后一张图片可以使用类似:MYVARIABLE_temperatureAMYVARIABLE_temperatureB 作为主题。

那么,是否可以使用 Node-RED 做类似的事情?或者解决方案只是创建一个自定义节点,该节点具有用于放置值的特定字段?

【问题讨论】:

    标签: node-red


    【解决方案1】:

    不使用全局上下文,但您可以使用以下语法使用环境变量:

    $(ENV_VAR_NAME)
    

    因此,您可以在配置变量前面加上一个环境变量,然后更改它们以更新节点(重启 Node-RED)

    【讨论】:

    • 我明白了...但是我可以在哪里为变量 ENV_VAR_NAME 添加值?
    • 取决于 node-red 运行的是什么,但您可以在启动 node-red 之前在 cmd 行上设置它们
    • 您的意思是在启动 Node-RED 之前在终端上设置为系统变量吗?你能给我更多的细节吗?我尝试设置系统变量,但它不起作用:/
    【解决方案2】:

    也许这有帮助:https://nodered.org/docs/writing-functions#global-context

    全局上下文

    还有一个可供所有节点共享且可供所有节点访问的全局上下文。例如,让变量 foo 在画布上全局可用:

    global.set("foo","bar");  // this is now available to other nodes
    

    然后可以使用 .get 读取

    var myfoo = global.get("foo");  // this should now be "bar"
    

    【讨论】:

    • 正如另一个答案中所讨论的,全局上下文对这个问题没有用
    【解决方案3】:

    我知道这是一篇旧帖子,但目前在 node-red google 组中提供的方法是 Nick O'Leary 如下:

    1. 编辑您的 node-red 设置文件 (/home/pi/.node-red/settings.js) 并添加以下内容(在 module.exports 行上方):

      process.env.HOSTNAME = require('os').hostname();

    2. 重新启动 Node-RED。 Et Voila - $(HOSTNAME) 现在可以工作了。

    您可以在process.env 对象下设置您想要的任何环境变量。

    假设您想添加 FOO 并将其设置为“只是另一个栏”,您将添加以下内容: process.env.FOO = '只是另一个酒吧'; 现在你可以使用它了。

    【讨论】:

    • HOSTNAME 是一种特殊情况,由于某种原因,NodeJS 将其从启动时暴露的环境变量列表中删除。不需要通过settings.js 文件设置任何其他内容,实际上在 PaaS 环境中更难做到
    • 您可以使用此方法添加任何变量。添加(在 module.exports 行上方):
    猜你喜欢
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    • 2018-04-04
    • 2017-12-02
    • 2018-10-14
    • 2019-02-04
    • 2013-11-05
    • 1970-01-01
    相关资源
    最近更新 更多