Node-RED-Nodes-API-3-中文一览
节点状态
在运行时,节点能够与编辑器 UI 共享状态信息。 例如,MQTT 节点可以指示它们当前是否已连接。
要设置其当前状态,节点使用该函数。例如,MQTT 节点使用以下两个调用来设置上图所示的状态:status
1 | this.status({fill:"red",shape:"ring",text:"disconnected"}); |
默认情况下,节点状态信息显示在编辑器中。可以通过在下拉菜单中选择 Display Node Status 选项来禁用和重新启用它。
Status 对象
状态对象由三个属性组成:fill shape text
前两个选项定义状态图标的外观,第三个选项是与图标一起显示的可选短文本(小于 < 20 个字符)。
该属性可以是:shape ring dot
该属性可以是:fill red green yellow blue grey
这允许使用以下图标:
如果状态对象为空对象,则从节点中清除状态条目 {}
注意:Status 节点
从 Node-RED v0.12.x 开始,Status 节点可用于捕获任何节点状态更新,例如连接和断开连接消息,以触发其他流。
配置节点
部分节点需要共享配置。例如,MQTT 输入和 MQTT 输出 节点共享 MQTT 代理的配置,允许它们将 连接。默认情况下,配置节点的范围是全局的,这意味着 状态将在流之间共享。
定义 config 节点
配置节点的定义方式与其他节点相同。有两个主要区别:
- 其属性设置为
category config
- 编辑模板元素的 ID 为
<input> node-config-input-<propertyname>
remote-server.html
1 | <script type="text/javascript"> |
remote-server.js
1 | module.exports = function(RED) { |
在此示例中,节点充当配置的简单容器 - 它没有实际的运行时行为。
config nodes 的一个常见用途是表示与远程系统的共享连接。在这种情况下,config 节点还可能负责创建连接并将其提供给使用 config 节点的节点。在这种情况下,config 节点还应处理 close
事件 在节点停止时断开连接。
使用 config 节点
节点通过向数组添加属性来注册它们对 config 节点的使用,并将属性设置为 config 节点的类型 defaults type
1 | defaults: { |
与其他属性一样,编辑器在编辑模板中查找 id 为的。与其他属性不同,编辑器将此元素替换为填充了 config 节点的可用实例的元素,以及用于打开 config node edit 对话框的按钮 <input> node-input-<propertyname> <input> <select>
然后,节点可以使用此属性访问 runtime 中的 config 节点。
1 | module.exports = function(RED) { |
Node 帮助样式指南
选择节点后,其帮助文本将显示在 info 选项卡中。这个帮助应为用户提供使用节点所需的所有信息。
以下样式指南介绍了应如何构建帮助以确保节点之间的外观一致。
从 2.1.0 开始:帮助文本可以作为 markdown 而不是 HTML 提供。在这个 case 时,标记的属性必须为(原文后面也没有内容)。
创建 markdown 帮助文本时要注意缩进,markdown 对空格敏感,因此所有行都不应在标签内有前导空格。type <script> text/markdown <script>
本节提供了对节点的高级介绍。它应该是长度不超过 2 或 3 行。第一行 () 用作将鼠标悬停在调色板中的节点上的工具提示。
连接到 MQTT 代理并发布消息。
如果节点有输入,本节介绍节点将使用的消息的属性。还可以提供每个属性的预期类型。描述应简短 - 如果需要进一步描述,则应位于 Details 部分。
如果节点具有输出,则与 Inputs 部分一样,此部分介绍节点将发送的消息的属性。如果节点具有多个输出,则可以为每个输出提供单独的属性列表。
本节提供有关节点的更多详细信息。它应该解释应该如何使用它,提供有关其 inputs/outputs 的更多信息。
此部分可用于提供指向外部资源的链接,例如:
- 任何相关的附加文件。例如 Template 节点如何链接 到 Mustache 语言指南。
- 节点的 Git 存储库或 npm 页面 - 用户可以在其中获得其他帮助
示例
上面的示例是使用以下内容创建的:
HTML
1 | <script type="text/html" data-help-name="node-type"> |
MarkDown
1 | <script type="text/markdown" data-help-name="node-type"> |
章节标题
每个部分都必须用标签标记。如果该部分需要子标题,它们必须使用标签<h3> Details <h4>
HTML
1 | <h3>Inputs</h3> |
MarkDown
1 | ### Inputs |
消息属性
消息属性列表用列表进行标记。该列表必须具有 class 属性 <dl> message-properties
列表中的每个项目都由一对 and 标签组成 <dt> <dd>
每个都包含属性名称和包含预期属性类型的可选选项。如果该属性是可选的,则应具有 class 属性 <dt> <span class="property-type"> <dt> optional
每个都包含属性的简要说明。<dd>
HTML
1 | <dl class="message-properties"> |
MarkDown
1 | : payload (string | buffer) : the payload of the message to publish. |
多个输出
如果节点有多个输出,则每个输出都应该有其自己的 message 属性列表,如上所述。这些列表应该包装在一个列表中,并带有 class 属性为 <ol> node-ports
列表中的每个项目都应包含输出的简要说明,后跟消息属性列表<dl>
注意:如果节点只有一个输出,则不应将其包装在这样的列表中,而只使用 <dl>
HTML
1 | <ol class="node-ports"> |
MarkDown
1 | 1. Standard output |
一般指导
在上述消息属性列表之外引用消息属性时,应为它们添加前缀,以便读者清楚地了解它是什么。它们应该包装在标签中 msg. <code>
1 | The interesting part is in <code>msg.payload</code>. |
不应在帮助文本的正文中使用其他样式标记(例如,<b> <i>
)。
帮助不应假设读者是经验丰富的开发人员或对 node 公开的任何内容非常熟悉;最重要的是,它需要有帮助。
添加示例流
打包节点可以提供简单的示例流来演示如何使用它。
它们将显示在 library import 菜单的 Examples 部分下。
理想情况下,它们应该简短,有一个 comment 节点来描述功能,而不是使用 需要安装的任何其他第三方节点。
要创建示例,请将流文件添加到节点包中的目录。有关更多详细信息,请参阅打包。examples
流文件的名称将是菜单列表中显示的菜单项。例如:
1 | examples\My Great Example.json |
将显示为
1 | My Great Example |
国际化
如果节点被打包为适当的模块,它可以包含一条消息 catalog 中,以便在编辑器和运行时中提供已翻译的内容。
对于模块的中标识的每个节点,相应的一组消息目录和帮助文件可以与节点文件一起包含 package.json .js
给定一个标识为以下的节点:
1 | "name": "my-node-module", |
可能存在以下消息目录:
1 | myNode/locales/__language__/my-node.json |
该目录必须与节点文件位于同一目录中。locales .js
路径的一部分标识相应文件提供的语言。默认情况下,Node-RED 使用 __language__ en-US
消息目录
消息目录是一个 JSON 文件,其中包含节点可能会显示在编辑器中或记录在运行时中。
例如:
1 | { |
目录在特定于节点的命名空间下加载。对于上面定义的节点,此目录将在命名空间下可用 my-node-module/myNode
核心节点使用命名空间 node-red
帮助文本
帮助文件提供了节点帮助文本的翻译版本,该文本获取 显示在编辑器的 Info 侧边栏选项卡中。
使用 i18n 消息
在运行时和编辑器中,都为节点提供了用于从目录中查找消息的函数。这些预定义为节点自己的命名空间,因此无需在消息标识符中包含命名空间。
运行
节点的运行时部分可以使用该函数访问消息。例:RED._()
1 | console.log(RED._("myNode.message1")); |
状态消息
如果节点向编辑器发送状态消息,则应将状态设置为消息标识符 text
1 | this.status({fill:"green",shape:"dot",text:"myNode.status.ready"}); |
核心 node-red 目录中有许多常用的状态消息。可以通过在标识的消息中包含命名空间来使用这些选项:
1 | this.status({fill:"green",shape:"dot",text:"node-red:common.status.connected"}); |
编辑器
节点模板中提供的任何 HTML 元素都可以指定一个属性,以提供要使用的消息 identify 。例如:data-i18n
1 | <span data-i18n="myNode.label.foo"></span> |
默认情况下,元素的文本内容将替换为标识的消息。还可以设置元素的属性,例如 :placeholder <input>
1 | <input type="text" data-i18n="[placeholder]myNode.placeholder.foo"> |
可以组合这些来指定多个替换。例如 要同时设置 title 属性和显示的文本:
1 | <a href="#" data-i18n="[title]myNode.label.linkTitle;myNode.label.linkText"></a> |
除了 html 元素的属性外,所有节点定义函数(例如 data-i18n oneditprepare this._()
)都可用于检索消息。
在编辑器中加载额外资源
从 Node-RED 1.3 开始
节点可能需要在编辑器中加载额外的资源。例如,在其帮助中包含图像或使用外部 JavaScript 和 CSS 文件。
在早期版本的 Node-RED 中,节点必须创建自定义 HTTP Admin 端点来提供这些资源。
在 Node-RED 1.3 或更高版本中,如果模块有一个在顶层调用的目录,则运行时将在 url 下使该目录中的任何内容对编辑器可用。resources
/resources/<name-of-module>/<path-to-resource>
例如,给定以下模块结构:
1 | node-red-node-example |
默认的 Node-RED 配置会将这些资源文件公开为:
http://localhost:1880/resources/node-red-node-example/image.png
http://localhost:1880/resources/node-red-node-example/library.js
注意:如果使用有范围的模块名称,则需要将范围包含在 path 中:
http://localhost:1880/resources/@scope/node-red-contrib-your-package/somefile
在编辑器中加载资源
在编辑器中加载资源时,节点必须使用相对 URL 而不是绝对 URL。这允许浏览器相对于编辑器 URL 解析 URL,并且无需节点了解其根路径的配置方式。
使用上面的示例,可以使用以下 HTML 在编辑器中加载这些资源:
<img src="resources/node-red-node-example/image.png" />
<script src="resources/node-red-node-example/library.js">
请注意,URL 不以 . /
将子流打包为模块
Subflow Modules 是在 Node-RED 1.3 中添加的。
在这个阶段,它们应该被认为是实验性的。如果您选择发布 您自己的 Subflow,请确保它已经过全面测试。
子流可以打包为 npm 模块,并像任何其他节点一样进行分发。
安装后,它们将作为常规节点显示在调色板中。用户无法查看或修改子流内的流。
在此阶段,创建 Subflow 模块是一个手动过程,需要手动编辑 Subflow JSON。我们将来会提供工具来帮助实现自动化 - 但就目前而言,这些说明应该可以帮助您入门。
创建子流
任何 subflow 都可以打包为一个模块。在执行此作之前,您需要考虑如何使用它。以下清单是需要考虑的事项的有用提醒:
- 配置 - 用户需要在子流中配置什么。您可以通过 子流属性 编辑对话框定义子流属性以及提供哪些 UI 来设置这些属性。
- 错误处理 - 您的子流是否正确处理其错误?有些错误可能在子流中处理是有意义的,有些错误可能需要从子流中传递出去,以允许最终用户处理它们。
- Status - 您可以将自定义状态输出添加到可由 ‘Status’ 节点处理的子流中。
- 外观 - 确保为子流提供对它提供的功能有意义的图标、颜色和类别。
添加子流元数据
子流可以保存其他元数据,这些元数据可用于定义将打包到的模块。
在 子流模块属性 编辑对话框中,您可以设置以下属性:
Module
- npm 包名称Node Type
- 这将默认为子流的属性。提供更好的 type 值会很有帮助。与常规节点类型一样,它必须是唯一的,以避免与其他节点冲突。id
Version
Description
License
Author
Keywords
创建模块
这就是 Node-RED 之外的手动工作的用武之地。
-
使用要为模块指定的名称创建一个目录。在此示例中,我们将使用 .
node-red-example-subflow
mkdir 节点-红色-示例-子流 cd 节点-红色-示例-子流
-
用于创建文件:
npm init package.json
npm 初始化
它将询问一系列问题 - 提供您添加到子流元数据的值的匹配答案。
-
添加一个文件 - 因为所有好的模块都必须有 README。
README.md
-
为您的模块创建一个 JavaScript 包装器。对于此示例,我们将使用:
example.js
1
2
3
4
5
6
7
8
9const fs = require("fs");
const path = require("path");
module.exports = function(RED) {
const subflowFile = path.join(__dirname,"subflow.json");
const subflowContents = fs.readFileSync(subflowFile);
const subflowJSON = JSON.parse(subflowContents);
RED.nodes.registerSubflow(subflowJSON);
}这将读取一个名为 (我们稍后将创建) 的文件的内容,对其进行解析,然后将其传递给函数。
subflow.json RED.nodes.registerSubflow
添加您的子流 json
完成所有这些作后,您现在可以将子流添加到模块中。这需要对子流 json 进行一些仔细的编辑。
- 在 Node-RED 编辑器中,将子流的新实例添加到工作区。
- 选择实例后,导出节点(或)并将 JSON 粘贴到文本编辑器中。如果您在 Export 对话框的 JSON 选项卡上选择 ‘formatted’ 选项,下一步将会更容易。
Ctrl-E Menu->Export
JSON 的结构为 Node 对象的 Array。最后一个条目是子流定义,最后一个条目是您添加到工作区的子流实例。
1 | [ |
- 删除 Subflow Instance 节点 - 数组中的最后一个条目。
- 将 Subflow Definition 节点移动到文件顶部 - 在 Array
[
- 将剩余的 Array 节点移动到 Subflow Definition 节点中,作为名为
"flow"
的新属性。 - 确保整理移动条目之间的所有尾随逗号。
- 将此文件另存为
subflow.json
1 | { |
更新您的package.json
最后一项任务是更新你的模块,以便 Node-RED 知道您的模块包含什么。package.json
添加一个部分,其中的一个部分包含文件的条目:"node-red" "nodes" .js
1 | { |
添加依赖项
如果您的子流使用任何非默认节点,则必须确保文件将它们列为依赖项。这将确保它们与您的模块一起安装 package.json
这些模块列在标准 top-level section 和 section 中的一节中。"dependencies" "dependencies" "node-red"
1 | { |