NodeJs – 4 – Node 기본 기능

 ** URL 모듈
> 주소 문자열을 객체로 만들어 문자열 안에 있던 각각의 정보를 나누어 그 객체의 속성에 보관.
> Example
https://www.google.co.kr/?gwr_rd=ssl#newwindow=1&q=actor
protocol : 'https'
host : 'www.google.co.kr'
query :'gws_rd=ssl#newwindow=1&q=actor


>parse() - 주소 문자열을 파싱하여 URL 객체를 만듬.
>format() - URL  객체를 주소 문자열로 변환


** querystring
> parse() - 요청 파라미터 문자열을 파싱하여 요청 파라미터 객체로 만듬
> stringify() - 요청 파라미터 객체를 문자열로 변환


> 파일


> 로그 남기기
>> winston 모듈 활용







 

NodeJs – 6 – 쿠키, 세션 관리하기

 사용자가 로그인 상태인지 아닌지 확인하고 싶을 때 쿠키나 세션 사용.
쿠키는 클라이언트 웹 브라우저의 정보,
세션은 웹 서버에 저장되는 정보.


> 쿠키 처리하기
>> code
var cookieParser = require('cookie-parser');
....
app.use(cookieParser());
....


var router = express.Router();




router.route('/process/showCookie').get(function(req, res){
  console.log('/process/showCookie 호출');
  res.send(req.cookies);
});


router.route('/process/setUserCookie').get(function(req, res){
  console.log('/process/setUserCookie 호출');
  res.cookie('user', {
    id: 'boy',
    name: '찰리',
    authorized: true
  });
  res.redirect('/process/showCookie');
});


app.use('/', router);


>> 설치


npm install cookie-parser --save


> 세션처리하기


로그인하면 세션 생성, 로그아웃하면 세션 삭제 -> 로그인하기 전까지 접근을 제한할 수 있음.


>> 설치
npm install express-session --save


>> code


var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');


....


app.use(cookieParser());
app.use(expressSession({
  secret: 'my key',
  resave: true,
  saveUninitialized: true
}));


var router = express.Router();


// session check
router.route('/process/product').get(function(req, res) {
  console.log('/process/product 호출됨');
  if (req.session.user) {
    res.redirect('/html/product.html');
  } else {
    res.redirect('/html/login2.html');
  }
});


app.use('/', router);


// login
router.route('/process/login').pose( function(req, res) {
  console.log('/process/login 호출');
  var paramId = req.body.id || req.query.id;
  var paramPassword = req.body.password || req.query.password;


  if (req.session.user) {
    console.log('이미 로그인되어 상품 페이지로 이동됩니다.');
    res.redirect('/public/product.html');
  } else {
    req.session.user = {
      id: paramId,
      name: 'boy',
      authorized: true
    };


    res.writeHead('200', {
      'Content-Type': 'text/html;charset=utf8'
    });
    res.write('<h1>로그인 성공</h1>');
    res.write('<div><p>Param id: ' + paramId + '</p></div>');
    res.write('<div><p>Param password: ' + paramPassword + '</p></div>');
    res.write("<br><br> <a href='/process/product'>상품 페이지로 이동하기</a>");
    res.end();
  }
});


router.route('/process/logout').get(function(req, res) {
  console.log('/process/logout 호출됨');


  if (req.session.user) {
    console.log('로그아웃합니다.');
    req.session.destroy(function(err){
      if (err) { throw err;}
      console.log('세션을 삭제하고 로그아웃되었습니다');
      res.redirect('/public/login2.html');
    });
  } else {
    console.log('아직 로그인되어 있지 않습니다.');
    res.redirect('/public/login2.html');
  }
});







 

NodeJS – 5 – 웹서버만들기

 -- 미들웨어


> npm install express --save


>static 미들웨어
>> npm install server-static ---save
>>>app.use(express.static(path.join(__dirname, 'public')));


> body-parser 미들웨어
>> npm install body-parser --save
>>>
app.use(bodyParser.json());    // application/json 형식으로 전달된 요청 파라미터를 파싱.
app.use(bodyParser.urlencoded({ extended: true }));    // application/x-www-form-urlencoded 형식으로 전달된 요청 파라미터를 파싱.


> Router 미들웨어


// app.js
var router = express.Router();


.....


router.route('process/login:name').post('function(req,res) {
....
});


app.use('/'.router);


// html.html


<form method="post" action="/process/login/boy">


// 등록되지 않은 패스에 대해 페이지 오류 응답
app.all('*', function(req, res) {
  res.send(404, '<h1> 페이지를 찾을 수 없음돠. </h1>');
});


 express-error-handler 미들웨어


>> npm install express-error-handler --save


>>> code


var expressErrorHandler = require('express-error-handler');
....
var errorHandler = expressErrorHandler({
  static: {
    '404': './public/html/404.html'
  }
});


app.use(expressErrorHandler.httpError(404) );
app.use(errorHandler);
....


> Using Token
>>> code


var router = express.Router();


.....


router.route('process/users/:id').get('function(req,res) {
var paramId = req.params.id;
  console.log('/process/usersdhk 토큰 %s를 사용해 처리함', paramId);


  res.writeHead('200', {'Content-Type':'text/html;charset=utf8'});
  res.write('<h1> Express 서버에서 응답한 결과입니다.</h1>');
  res.write('<div><p>Param Id:'+paramId+'</p></div>');
  res.end();
});


app.use('/'.router); 

How to prevent UI Flickering

  1. Create winform below code
protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;  // WS_EX_COMPOSITED
                cp.ExStyle |= 0x02000000;
                return cp;
            }
        }

WS_EX_COMPOSITED works by forcing child windows to draw back to front and by double buffering them;  (더블버터링을 위해서는 위 옵션을 사용한다.)

2. Set Double Buffering

this.SetStyle(ControlStyles.AllPaintingInWmPaint |
ControlStyles.UserPaint |
ControlStyles.DoubleBuffer,
true);

Node.js – 3 : Javascript

 ** Array
>push() : 배열의 끝에 요소 추가
>pop() : 배열의 끝 요소 삭제
>unshift() : 배열의 앞에 요소 추가
> shift() : 배열의 앞에 요소 삭제
> splice(index, removeCount, [Object]) : 여러개의 객체를 요소로 추가하거나 삭제. ex> splice(2,0,..) : 2인덱스부터 객체 삽입.
> splice(index, copyCount) : 여러 개의 요소를 잘라내어 새로운 배열 객체로 만듬. ex> splice(2,2) : 2인덱스 부터 2개 삭제
> delete : 배열 요소 삭제 ex> delete Users[1]; 1인덱스 배열 요소 삭제. 데이터만 삭제되어 배열 사이즈는 변동 없음.
>> example


Users.splice(1,0,{name:'bear', age:25});
console.log('splice()로 한개를 1인덱스에 추가한 후;);
console.dir(Users);


Users.splice(2,1);
console.log('splice()로 2인덱스 한개 삭제한 후;);
console.dir(Users);


> slice(int startindex, int endindex)
var Users2 = Users.slice(1,3);
var User3 = User2.slice(1);


** callback
> example
function add(a, b, callback){
    var result = a+b;

    callback(result);

}


add(10,10, function(result){
    console.log('resule : %d', result);

});


> example 1
function add(a,b, callback)
{ 
    var result = a + b;

    callback(result);



    var history = function() {

        return a+'+'+b+'='+result;

    }
    return history;

}


var add_history = add(10, 10, function(result) {
    console.log('add %d', result);

});


conslog.log('result : ' + add_history());


> example 2
function add(a,b, callback)
{ 
    var result = a + b;
    callback(result);


    var count = 0;

    var history = function() {
        count++;

        return count + ': ' + a+'+'+b+'='+result;
    }
    return history;
}


var add_history = add(10, 10, function(result) {
    console.log('add %d', result);
});


conslog.log('result : ' + add_history());
conslog.log('result : ' + add_history());
conslog.log('result : ' + add_history());
>>>> Closure


** Prototype
function Person(name ,age) {
    this.name = name;

    this.age = age;

}


Person.prototype.walk = function(speed) {
    console.log(speed + 'km');

}


var person01 = new Person('P_1', 20);
var person02 = new Person('P_2', 22);


person01.walk(10);


> prototype 속성을 추가하면 인스턴스 객체를 만들 때 메모리를 효율적으로 관리할 수 있음.













 

Node.js – 2 : module

** Module

> exports  – calc.js

exports.add = function(a,b) {    return a+b;
};
exports.multiply = function(a,b){    return a*b;
}
==== test5.js ====

var calc = require(‘./calc’);console.log(‘result : %d’, calc.add(10,100));


> module.exports – calc_2.js

var calc = {};

clac.add = function(a,b) {    return a+b;};
clac.multiply = function(a,b){    return a*b;}
module.exports = calc;
==== test6.js ====
var calc = require(‘./calc_2’);

console.log(‘result : %d’, calc.add(10,100));> 외장 모듈
>>nonf 설치

npm install nconf
var nconf = require(‘nconf’);

nconf.env();

console.log(‘OS result : %s’, nconf.get(‘OS’));
>> In most cases you are behind a proxy… ; Error

>>>프록시 서버 확인 : netstat

>>>설정 

npm config set proxy http://address:port

npm config set https-proxy http://address:portnpm config set strict-ssl false
>> 설치 제거

npm uninstall nconf

>> package.json 설치

    npm init
    (name) : node
    npm install nconf –save

>> 현재 프로젝트에 설치된 외장 모듀들을 다른 프로젝트에 외장 설치  package.json 복사

  npm install
> 내장 모듈
>> 내장 모듈 정보 : http://nodejs.org/api

>> os 모듈운영체제 호스트 이름 : hostname()

시스템의 전체 메모리 용량 : totalmem()

시스템 사용 가능한 메모리 용량 : freemem()

CPU 정보 :  cpus()

네트워크 인터페이스 정보 : newworkInterface()
var os = require(‘os’);
console.log(‘hostname : %s’, os.hostname());

console.log(‘memory : %d/%d’, os.freemem(), os.totalmem());

console.log(os.cpus());console.log(os.networkInterfaces());
>> path 모듈

하나의 파일 패스로 : join()

디렉터리 이름 : dirname()

파일 이름만 : basename()

확장자만 : extname()
var path = require(‘path’);
// 디렉토리 이름 합치기

var directories = [“users”, “hwai”, “docs”];

var docsDir = directories.join(path.sep);

console.log(‘directory: %s’, docsDir);
//디렉토리 이름과 파일 이름 합치기

var curPath = path.join(‘/Users/hwai’, ‘notepad.exe’);

console.log(‘path: %s’,curPath);
var filename = “C:\\Users\\hwai\\notepad.exe”;

var dirname = path.dirname(filename);

var basename = path.basename(filename);

var extname = path.extname(filename);

Node.js – 1 : Setting

– Port

0~1023 : 잘 알려진 포트

1024~49151 : 등록된 포트

49152~65535 : 동적 포트

– Ajax(Asynchronous Javascript And XML)

웹 서버에서 웹 문서를 받아오는 것이 아니라 데이터만 받아오기 위한 방법과 기술을 말함.

– 웹서버

기본구조 : 익스프레스(Express) 프레임워크

데이터 저장 및 조회 : MongoDB

클라이언트에 응답을 보낼 때 사용하려고 미라 웹 문서의 원형을 만들어 놓는 것 : 뷰 템플릿(View Template)

사용자 로그인이나 회원가입을 위해 사용 : 패스포트(Passport)

– JSON-RPC 서버

Data : Json

RPC : Remote Procedure Call

– 위치기반서버

DB에서 위치값(위도, 경도)를 효율적으로 읽기 : 2차원 인덱싱 방법 사용 : R-Tree, R*Tree

– Node.js

자바스크립트를 이용해서 서버를 만들 수 있는 개발 도구.

– Non-Blocking IO 방식 : 비동기 입출력 방식 – 하나의 요청 처리가 끝날 때까지 기다리지 않고 다른 요청을 동시에 처리하는 방식.

– Callback 시스템 : 작업이 완료하면 Callback 함수 호출.

– Blocking IO code

var contents = file.read(‘a.txt’);

doShow(content);

var result = doAdd(10,10);

– Non-Blocking IO

file.read(‘a.txt’, function(contents)){

doShow(contents);

});

var result = doAdd(10,10);

– 이벤트 기반 입출력(Event driven I/O) 모델

파일 시스템이 이벤트화 함께 호출하는 방식

– 크롬 V8 엔진

자바스크립트 코드를 네이티브 코드로 바꾼 후 실행. 빠르게 실행 가능.

노드를 설치한 다음 노드로 프로그램을 만들어 실행하면 크롬 V8 엔진 위에서 실행됨.

– 바인딩

[객체].on([이벤트 이름], [함수 객체]);

res.on(‘data’, function(){…});

– Commonjs

자바크스립트를 브라우저뿐 아니라 서버 쪽 프로그램이나 PC용 프로그램에서도 사용하려고 조직한 자발적인 워킹 그룹.

– npm(Node Package Manager)

다른 프로그래머가 미리 개발하여 올려 둔 패키지를 찾아 설치하는 방법을 제공

– 브라켓설치

http://brackets.io

프로젝트 폴더는 사용자 폴더에 생성 – 권한문제가 발생할 수 있음.

C:\Users\Hwai

– 확장 기능 설치

파일 -> 확장 기능 관리자

Custom Work – 파일 탭 표시

Brackets Icons – 파일 앞에 아이콘 표시

NodeJS Integration – Ctrl + Shift + N : 바로 실행결과 확인.

– 노드 설치하기

https://nodejs.org

LTS 버젼 설치 -> Add to Path 선택되어 있는지 체크.

– 명령어

node -v : node 버젼 체크

npm -v : npm 버젼 체크

– Log

console.log(‘Number : %d’, 10);

console.log(‘String : %s’, ‘Girl’);

console.log(‘JSON : %j’, {name : ‘Girl’});

– time log code

var result = 0;

console.time(‘sum_time’);

for(var i=1; i<=1000; i++)

{

result += i;

}

console.timeEnd(‘sum_time’);

console.log(‘1~1000 sum : %d’, result);

console.log(‘current filename : %s’, __filename);

console.log(‘current path : %s’, __dirname);

– Object log

var Animal = {name:’Dog’, age:10};

console.dir(Animal);

console.log(‘argv count:’ + process.argv.length);

console.dir(process.argv);

– log : node test1.js __port 10421

if( process.argv.length > 2)

{

console.log(‘3rd parameter : %s’, process.argv[2]);

}

process.argv.forEach(function(item, index){

console.log(index + ‘:’, item);

}

– log env

console.dir(process.env);

console.log(‘OS : ‘ + process.env[‘OS’]);

[C#] – SetThreadExecutionState function

ValueMeaning
ES_AWAYMODE_REQUIRED0x00000040Enables away mode. This value must be specified with ES_CONTINUOUS.Away mode should be used only by media-recording and media-distribution applications that must perform critical background processing on desktop computers while the computer appears to be sleeping. See Remarks.
ES_CONTINUOUS0x80000000Informs the system that the state being set should remain in effect until the next call that uses ES_CONTINUOUS and one of the other state flags is cleared.
ES_DISPLAY_REQUIRED0x00000002Forces the display to be on by resetting the display idle timer.
ES_SYSTEM_REQUIRED0x00000001Forces the system to be in the working state by resetting the system idle timer.
ES_USER_PRESENT0x00000004This value is not supported. If ES_USER_PRESENT is combined with other esFlags values, the call will fail and none of the specified states will be set.

The system automatically detects activities such as local keyboard or mouse input, server activity, and changing window focus. Activities that are not automatically detected include disk or CPU activity and video display.

Calling SetThreadExecutionState without ES_CONTINUOUS simply resets the idle timer; to keep the display or system in the working state, the thread must call SetThreadExecutionStateperiodically.

To run properly on a power-managed computer, applications such as fax servers, answering machines, backup agents, and network management applications must use both ES_SYSTEM_REQUIRED and ES_CONTINUOUS when they process events. Multimedia applications, such as video players and presentation applications, must use ES_DISPLAY_REQUIRED when they display video for long periods of time without user input. Applications such as word processors, spreadsheets, browsers, and games do not need to callSetThreadExecutionState.

The ES_AWAYMODE_REQUIRED value should be used only when absolutely necessary by media applications that require the system to perform background tasks such as recording television content or streaming media to other devices while the system appears to be sleeping. Applications that do not require critical background processing or that run on portable computers should not enable away mode because it prevents the system from conserving power by entering true sleep.

To enable away mode, an application uses both ES_AWAYMODE_REQUIRED and ES_CONTINUOUS; to disable away mode, an application calls SetThreadExecutionState with ES_CONTINUOUS and clears ES_AWAYMODE_REQUIRED. When away mode is enabled, any operation that would put the computer to sleep puts it in away mode instead. The computer appears to be sleeping while the system continues to perform tasks that do not require user input. Away mode does not affect the sleep idle timer; to prevent the system from entering sleep when the timer expires, an application must also set the ES_SYSTEM_REQUIRED value.

The SetThreadExecutionState function cannot be used to prevent the user from putting the computer to sleep. Applications should respect that the user expects a certain behavior when they close the lid on their laptop or press the power button.