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
總結
以上是生活随笔為你收集整理的node-red端口争用问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux课程笔记 硬盘介绍及硬盘分区
- 下一篇: 不同软件求解超导温度用的方程