상단

Nodejs


Cluster

 

PM2

 

Thread

  • nodejs_thread.md 파일 참조

 

NVM 설치 in Window 10

#--- NVM 1.1.7 설치 확인
nvm  --version                                

NVM 설치 in CentOS 7

NVM(Node Version Manager)를 사용하여 설치 한다.

주의: Nodejs 재설치시 global로 설치된 것은 다시 설치하여야 한다.

#--- NVM 0.35.2 설치
cd  ~
yum  -y  install  gcc  g++  make
curl -o- curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.2/install.sh | bash

source  ~/.bashrc
nvm  --version

NVM 설치 in Raspberry Pi

#--- NVM 0.35.3 설치
cd  ~
apt  install  build-essential
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
# curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash

source  ~/.bashrc
nvm  --version

#--- NVM 0.35.3 설치 for Raspberry Pi 4 Model B
#---     기존에 설치되어 있는 nodejs 삭제
apt remove --purge npm node-* nodejs-* libnode-dev libnode64

cd  ~
git  clone  https://github.com/nvm-sh/nvm.git  .nvm
cd  ~/.nvm
git checkout v0.35.3
cd ..
vi  ~/.bash_profile
    export NVM_DIR="$HOME/.nvm"
    . "$NVM_DIR/nvm.sh"
    . "$NVM_DIR/bash_completion"
source  ~/.bash_profile
nvm  --version

#--- Python 2.7
 

Node.js 설치와 OBCon SCADA 재구성

#--- Nodejs 12.13.1 (Erbium LTS) 설치, npm 6.12.1
nvm  list  available          #--- 사용 가능한 Node.js 버전 확인 in Windows
nvm  ls-remote                #--- 사용 가능한 Node.js 버전 확인 in Linux
#--- v15.2.1                in Windows, KT UCloud, CentOS 7
#--- v14.15.1 LTS(Fermium)  in Windows, KT UCloud, CentOS 7
#---     2020-10-27 LTS로 승격
#---     JavaScript Engine V8.1 장착
#--- v12.14.1               in CentOS 7
#--- v12.13.1               in Windows 10, KT UCloud, Raspberry Pi 4
#--- ??? in Raspberry Pi 3
    
nvm  ls
nvm  install  v12.13.1
nvm  use  12.13.1                       #--- 특정 버전의 nodejs 사용 설정
nvm  alias  default  12.13.1            #--- Linux에서 Default 설정

node  --version
npm  -v  

#--- OBCon SCADA에서 nodejs 재설치
cd  c:/work/obcon/obcon
rm  -rf  node_modules

npm  install
npm  install  -g  mocha
npm  install  -g  uglify-js
npm  install  -g  pm2
 

Socket.IO Server

Socket.IO 설치

npm  install  --save  socket.io
npm  install  --save  socket.io-client

Socket.IO 서버 코드

let http = require('http');             //--- HTTP Server 모듈
let express = require('express');       //--- Express 모듈
//--- https://www.npmjs.com/package/socket.io
let Socketio = require('socket.io');    //--- Socket.IO 모듈

let app_http = express();               //--- Express
let app_http_server = http.createServer(app_http);          //--- HTTP Application

// let io = Socketio(app_http_server);                      //--- Socket.IO
let io = Socketio(app_http_server, {
    path: '/socket.io',                 //--- Default. /socket.io
    transports: ['polling','websocket']
});

//--- Socket.IO 코드
io.use((socket, next) => {
    let token = socket.handshake.query.token;
    // let clientId = socket.handshake.headers['x-clientid'];

    if (isValid(token)) {
      return next();
    }
    return next(new Error('authentication error'));
});

io.on('connection', socket => {         //--- 접속시 호출
    let token = socket.handshake.query.token;
    console.log('Socketio :: socketio is connected.');

    socket.on('disconnect', () => {     //--- 종료시 호출
        console.log('Socketio :: socketio is disconnected.');
    });

    //--- 수신
    socket.on('채널', (msg) => {
        //--- 송신
        socket.emit('채널', rtMsg);
        socket.broadcast.emit('채널', rtMsg);
    });
});

//--- Application Server listening
app_http_server.listen(
    { hostname: '127.0.0.1', port: 80, agent: false },
    function () {
        console.log('Application Server on listening');
	}
);

Socket.IO Client



Nginx with Socket.IO

  • OBCon : 443 port/tcp

  • OBCon SCADA : 80 port/tcp

  • OBCon SCADA : 85 port/tcp

//--- OBCon Nginx
    server {
        listen       80;
        listen       [::]:80;
        server_name  obcon.biz www.obcon.biz;
        return  301  https://www.obcon.biz$request_uri;
    }

    server {
        listen       443 ssl;
        listen       [::]:443 ssl;
        server_name  obcon.biz www.obcon.biz;
        
        ssl_certificate         /etc/nginx/obcon.crt;
        ssl_certificate_key     /etc/nginx/obcon.key;
        ssl_session_timeout     10m;
        ssl_session_cache       shared:SSL:1m;
        ssl_protocols           SSLv3 TLSv1; # SSLv2
        ssl_ciphers             ALL:!aNull:!eNull:!SSLv2:!kEDH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+EXP:@STRENGTH;
        ssl_prefer_server_ciphers on;


        location /scada/ {
            proxy_no_cache 1;
            proxy_pass  http://211.252.87.34:80;
        }

        location /default/ {
            proxy_no_cache 1;
            proxy_pass  http://211.252.87.34:80;
        }

        location /service_scada_obcon/ {
            proxy_no_cache 1;
            proxy_pass  http://211.252.87.34:80;
        }
    }
        
//--- OBCon SCADA Nginx
    server {
        listen       80;
        listen       [::]:80;
        server_name  obcon.biz www.obcon.biz;
        
        location /scada/ {
            proxy_no_cache 1;
            proxy_pass  http://127.0.0.1:85;
        }
    }

cd  /usr/share/nginx/html
ln  -s  /work/appl/obcon/themes/default/  default
ln  -s  /work/appl/obcon/themes/service_scada_obcon/  service_scada_obcon        
 

참고 문헌

 

Export/Import


 

주의 사항

  • import 문은 항상 파일의 최상위에서 사용 한다.

    • 중간에 선언하더라도 최상위에서 실행 된다.

  • from 뒤는 문자열만 가능 하다.

  • 실행 프로그램은 aync 함수에서 호출되므로 최상위에 await문을 사용할 수 있다.

Default Export/Import

// module.exports = conf;

//--- Sample
export default expression;
export default function (~) { ~ };
export default function name1(~) { ~ };
export { name1 as default, ~ };

import defaultMember, { member ~ } from "~";
import defaultMember, * as alias from "~";
import defaultMember from "~";
 

Named Export/Import

//--- Sample
export const name1, name2, ~, nameN;
export const name1 = ~, name2 = ~, ~, nameN;
export function functionName(){...}
export class ClassName {...}
export { name1, name2, ..., nameN };
export { variable1 as name1, variable2 as name2, ..., nameN };
export const { name1, name2: bar } = o;

import * as obj from "~";               //--- 모듈 전체를 import
import obj from "~";                    //--- 모듈 전체를 import
import { member } from "~";
import { member as alias } from "~"; 
import { member1, member2 } from "~";
import { member1, member2 as alias2, [...] } from "~";
 

동적 import

  • include/require.js 파일 참조

const importModule = await import(~);
const defaultMember = importModule.default;

import(~)
    .then(obj => { ~ })
    .catch(err => { ~ });

기타 Export/Import

import "~";                             //--- 실행만 한다.