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# Run application with administrator permission

  1. Select your project
  2. Alt+Enter(view Attribute)
  3. Off ClickOnce Security
  4. Open app.minifest which is created
  5. delete this code

delete <requestExcutionLevel level=”asInvoker” uiAccess=”false”/>

Add this code!!!!

<requestExcutionLevel level=”highestAvailable” uiAccess=”false”/>

That’s all!

[Visual Studio] How to use Installer

  1. Create installer project
  2. Application Folder -> Add -> Primary Output -> Default Output -> Select Your Project
  3. Application Folder -> Add -> Local Resource : ex> Language.resx is imported
  4. Application Folder -> Add -> Contents File : ex> Sound File


5. User’s Desktop -> Create ShortCut in Right window -> Renaming -> Open Attribute window -> import icon file

6. Select Setup project -> open Attribute window -> Set Info