一、如何修改工程为自定义路径
Windows本地部署了Node-red后,一般来说其配置数据文件(一般是settings.js)和流文件(一般是flow_<hostname>.json)会默认放在用户目录的.node_red子目录中,即:
C:\Users\Administrator\.node-red
但是我们经常需要建立自己的工程目录(如C:\myproject),并把相关数据放在该目录中,那么就要做如下的事情:
1)建立工程目录F:\program\nodejs\nodered\mytest,将settings.js拷贝到该目录中。
2)修改C:\myproject\settings.js文件中的userDir参数为F:\program\nodejs\nodered\mytest。如果想把Node-red UI的root目录也修改为工程目录的话,则需要将settings.js文件中的httpRoot和httpStatic参数数值修改为
F:\program\nodejs\nodered\mytest
3)在启动Node-red的cmd或者bat文件的命令行中加入如下参数 --settings F:\program\nodejs\nodered\mytest,即:
> node-red --settings F:\program\nodejs\nodered\mytest
node-red --settings F:/program/nodejs/nodered/mytest/settings.js
二、如何创建自定义节点
每一个自定义节点的都由一对文件组成:
- 一个定义节点功能的JavaScript文件,
- 定义节点属性,编辑对话框和帮助文本的html文件。
1. 创建一个可以转换消息字符为小写的节点
确保系统的node版本位于10以上,创建一个目录node-red-contrib-example-lower-case,并在目录中创建以下文件:
- package.json
- lower-case.js
- lower-case.html
1)初始化package.json文件
使用npm init 生成标准package.json文件,可以使用命令npm init,并在生成命令执行出现提示时,为将文件命名为 node-red-contrib-example-lower-case。初始化完成json文件后,必须在文件中添加一个node-red部分:
{
"name" : "node-red-contrib-example-lower-case",
...
"node-red" : {
"nodes": {
"lower-case": "lower-case.js"
}
}
}
这里的描述告诉模块运行时包含了哪些节点文件。
2)创建对应的js文件
这里的js文件用于执行运行时的后台处理逻辑,示例代码如下:
module.exports = function(RED) {
function LowerCaseNode(config) {
RED.nodes.createNode(this,config);
var node = this;
node.on('input', function(msg) {
msg.payload = msg.payload.toLowerCase();
node.send(msg);
});
}
RED.nodes.registerType("lower-case",LowerCaseNode);
}
该节点被包装为Node.js模块。该模块导出一个函数,该函数在运行时在启动时加载节点时被调用。使用单个参数调用该函数,该参数RED提供模块对Node-RED运行时api的访问权限。
节点本身是由一个函数定义的,LowerCaseNode只要创建该节点的新实例,就会调用该函数。向其传递一个对象,该对象包含在流编辑器中设置的特定于节点的属性。
该函数调用该RED.nodes.createNode函数以初始化所有节点共享的功能。之后,特定于节点的代码生效。
在这种情况下,节点注册input事件的侦听器,每当消息到达节点时,该事件就会被调用。在此侦听器内,它将输入参数更改为小写,然后调用该send函数以在流中传递消息。
最后,LowerCaseNode使用节点名称将该函数注册到运行时lower-case。
如果节点具有任何外部模块依赖性,则必须将其包含在dependencies 其package.json文件的部分中。
3)创建对应HTML文件
HTML文件为自定义节点的配置界面描述,示例代码如下:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Node-Red mytest</title>
</head>
<body>
<script type="text/javascript">
RED.nodes.registerType('lower-case',{
category: 'function',
color: '#a6bbcf',
defaults: {
name: {value:""}
},
inputs:1,
outputs:1,
icon: "file.png",
label: function() {
return this.name||"lower-case";
}
});
</script>
<script type="text/html" data-template-name="lower-case">
<div class="form-row">
<label for="node-input-name"><i class="fa fa-tag"></i> Name</label>
<input type="text" id="node-input-name" placeholder="Name">
</div>
</script>
<script type="text/html" data-help-name="lower-case">
<p>A simple node that converts the message payloads into all lower-case characters</p>
</script>
</body>
</html>
节点的HTML文件提供以下内容:
- 在编辑器中注册的主节点定义
- 编辑模板
- 帮助文字
在此示例中,节点具有单个可编辑属性name。尽管不是必需的,但此属性有一个广泛使用的约定,以帮助区分单个流中节点的多个实例。
2. 添加节点
1)在自定义工程目录(或默认的nodered安装目录C:\Users\my_name\.node_red )下,安装上面创建的节点:
npm install F:\program\nodejs\nodered\node-red-contrib-example-lower-case --no-save
2)以自定义工程目录启动node red
node-red --settings F:/program/nodejs/nodered/mytest/settings.js
3. 测试使用
在网页端添加自定义节点,传入参数验证是否实现预计的效果:
如上如,添加自定义节点后,传入大写信息,注入后输出小写信息,验证无误。