node-red端口争用问题

1. node-red端口争用报错

node-red是一个用图形化编写nodejs的开源软件,今天在使用node-red的时候犯了一个错误,拖了两个socket.io控件并且都应用了默认配置,但是默认配置都是监听80端口且路径都是/socket.io,于是出现端口争用,node-red服务直接报错退出,且界面显示”lost connection”,所以也无法通过界面删除节点。报错信息如下:

28 May 04:52:02 - [info] Starting flows
28 May 04:52:02 - [info] [socketio-config:59cef138.845f18] Created server on port 80
28 May 04:52:02 - [info] [socketio-config:7de9d10c.ae919] Created server on port 80
28 May 04:52:02 - [info] [socketio-config:aa3fb59e.85a3b8] Created server on port 80
28 May 04:52:02 - [info] Started flows
28 May 04:52:02 - [red] Uncaught Exception:
28 May 04:52:02 - Error: listen EADDRINUSE 0.0.0.0:80
at Object.exports._errnoException (util.js:1018:11)
at exports._exceptionWithHostPort (util.js:1041:20)
at Server._listen2 (net.js:1258:14)
at listen (net.js:1294:10)
at Server.listen (net.js:1390:5)
at Server.listen.Server.attach (/usr/local/lib/node_modules/node-red/node_modules/socket.io/lib/index.js:238:9)
at new socketIoConfig (/usr/local/lib/node_modules/node-red/node_modules/node-red-contrib-socketio/socketio.js:26:7)
at createNode (/usr/local/lib/node_modules/node-red/red/runtime/nodes/flows/Flow.js:276:18)
at Flow.start (/usr/local/lib/node_modules/node-red/red/runtime/nodes/flows/Flow.js:65:31)
at start (/usr/local/lib/node_modules/node-red/red/runtime/nodes/flows/index.js:284:29)

2. 解决方法

我们可以从node-red启动时的打印信息中看到node-red的配置文件位置:

28 May 04:49:48 - [info] Settings file : /root/.node-red/settings.js
28 May 04:49:48 - [info] User directory : /root/.node-red
28 May 04:49:48 - [info] Flows file : /root/.node-red/flow_2fcc0fba92c4.json

其中flow_2fcc0fba92c4.json记录了各个节点的信息,只要找到对应的节点删除就可以了,不过用vim打开这个json文件后一大坨字符串,而且是单行,没法上下移动,删除也很麻烦。所以简单写了一个脚本,将json字符串转换为json对象,并用nodejs的repl让用户删除指定的Json对象。
nodejs的交互式编程参见这篇博文:http://www.cnblogs.com/youxilua/p/3528727.html

3. removeJSON.js

removeJSON.js代码如下:

#!/usr/bin/env node
const fs=require('fs');

if(process.argv[2]!='-f'||process.argv[3]==null){
        console.log('please input like this: node flow.fs -f flow.json' );
        process.exit();
}else{
        var filename=process.argv.slice(3);
        var filepath=__dirname+'/'+filename;
        if(fs.existsSync(filepath)){
                var content=fs.readFileSync(filepath);
                var jsonObj=JSON.parse(content);
                for(var i=0;i<jsonObj.length;i++){
                        console.log(i+":",jsonObj[i]);
                }
                process.stdout.write('please input number of json object that you want to remove:');
                process.stdin.resume();
                process.stdin.setEncoding('utf-8');
                process.stdin.on('data',function(number){
                        if(!parseInt(number)){
                                console.log("wrong number");
                                process.exit();
                        }else{
                                jsonObj.splice(number,1);
                                fs.writeFileSync(filepath,JSON.stringify(jsonObj));
                                process.exit();
                        }

                })
}else{
                console.log('this file does not exist:'+filepath);
                process.exit();
        }
}

运行效果如下:

root@2fcc0fba92c4:~/.node-red# node removeJSON.js -f flows_2fcc0fba92c4.json
0: { id: ‘a0defa02.280208’, type: ‘tab’, label: ‘Flow 1’ }
1: { id: ‘5074207d.a1fd78’,
type: ‘socketio-config’,
z: ”,
port: ‘80’,
sendClient: ‘true’,
path: ‘/socket.io’,
bindToNode: false }
2: { id: ‘c2cb0a78.d46408’,
type: ‘socketio-config’,
z: ”,
port: ‘80’,
sendClient: ‘true’,
path: ‘/socket.io’,
bindToNode: false }
3: { id: ‘cbc73924.ba753’,
type: ‘http in’,
z: ‘a0defa02.280208’,
name: ‘[get]index’,
url: ‘/index’,
method: ‘get’,
swaggerDoc: ”,
x: 227.49998474121094,
y: 81.99998474121094,
wires: [ [ ‘bcab7a60.38ff4’ ] ] }

please input number of json object that you want to remove:1

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值