Express 역시 제공되는 middleware 가 있습니다.

대표적으로 static middleware가 있습니다.



static 미들웨어는먼저 static 미들웨어는 특정 폴더의 파일들을 특정path로 접근할 수 있도록 만들어 줍니다.


예시로, public 폴더에있는 모든 파일을 웹서버 root path로 접근할 수 있도록 만들고 싶다면 다음 코드를 추가하면됩니다.


static 미들웨어는 외장 모듈로 만들어져있으며 설치가 필요합니다. 명령프롬프트에서 아래 명령어를  사용해 설치합니다.

> npm install serve-static --save



이코드는 public 폴더안에있는 파일들을 클라이언트에서 바로 접근할 수있게합니다.


만약다음과같이
           /public/index.html 에 파일이있다면

 웹브라우져에서
   === > http://localhost:3000/index.html 처럼 접근할수있습니다.

app.use('/public, static(path.join(__dirname, 'public')));

 



./apps.js

//Express 기본 모듈 불러오기.

var express = require('express');
var http = require('http');
var static = require('serve-static');
var path = require('path');
//Express 객체 생성
var app = express();

//기본포트를 app 객체에 속성으로 설정
app.set('port', process.env.PORT || 3000);


app.use(static(path.join(__dirname, 'public')));


//Express 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express 서버를 시작했습니다. : '+ app.get('port'));
});





public/index.html



index.html 입니다.

명령 프롬프트에 다음과 같이명령합니다.
> node app.js

웹브라우져에서 localhost:3000/index.html 을치면 다음과 같은 페이지가 출력되게 됩니다.


Express 요청 객체에 추가한 header와 parameter 분석



[표] Express에서 추가로 사용할 수 있는 요청 객체의 속성들.

 추가한정보          

 설명

 query    

 클라이언트에서 get방식으로 전송한 요청 파라미터를 확인합니다. ex) req.query.name

 body 

 클라이언트에서 POST방식으로 전송한 요청 파라미터를 확인합니다.

단 body-parser와 같은 외장 모듈을 사용해야합니다.

ex) req.body.name

 header(name) 

 헤더를 확인합니다.



요청하는 파라미터는 query string 이라고 합니다. 

클라이언트에서 서버로 요청할떄 문자열로 데이터를 전달하는것을 지칭합니다.


req객체의 query 객체 안에 넣어두어 사용합니다.


client 가 요청할 때 전달되는 헤더값들은 header()메소드로 확인할 수 있습니다.




//Express 기본 모듈 불러오기.

var express = require('express');
var http = require('http');

//Express 객체 생성
var app = express();

//기본포트를 app 객체에 속성으로 설정
app.set('port', process.env.PORT || 3000);



app.use(function(req, res, next){
console.log('첫번째 미들웨어 요청 처리');

var userAgent = req.header('User-Agent');
var paramName = req.query.name;

res.writeHead('200', {'Content-Type': 'text/html; charset=utf8'});
res.write('<h1>Express 서버에서 응답한 결과</h1>');
res.write('<div><p>user-agnet: ' + userAgent + '</p></div>');
res.write('<div><p>Param name: ' + paramName + '</p></div>');
res.end();

});


//Express 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express 서버를 시작했습니다. : '+ app.get('port'));
});



웹사이트에서 다음과 같은 url을 입력해봅니다.  query 에 name=jinss값을 넣어서 요청을 합니다.


http://localhost:3000/?name=jinss


[결과화면]



Client가 주소 문자열에 포함시켜 전달하는 요청 parameter를 web server에서 받아 확인할때는 복잡하지만, Express를 사용하면 매우 편하게 확인할 수 있습니다.






Express 의 요청 객체와 응답객체 알아보기



Express에서 추가로 사용할수있는 응답 객체 메소드.


 메소드이름   

 설명

 send([body])

  클라이언트에 응답 데이터를 보냅니다. 전달할 수 있는 데이터는 html 문자열, Buffer 객체, json 객체, json 배열입니다.

 status(code)

 http 상태코드를 반환합니다. 상태코드는 end()나 send()같은 전송 메소드를 추가로 호출해야전송할 수 있습니다.

 sendStatus(statusCode)

 http 상태 코드를 반환합니다. 상태코드는 상태메세지와함꼐 전송됩니다.

 redirect([status,] path)

 웹페이지 경로를 강제로 이동시킵니다.

 render(view[,locals][,callback])

 뷰엔진을 사용해 문서를 반든 후 전송합니다.


다음 아래와 같이, response (응답) 객체를 사용해보았습니다.


response 객체의 send method 사용예제입니다.



//Express 기본 모듈 불러오기.

var express = require('express');
var http = require('http');

//Express 객체 생성
var app = express();

//기본포트를 app 객체에 속성으로 설정
app.set('port', process.env.PORT || 3000);

//첫번째 미들웨어
app.use(function(req, res, next){
console.log("첫번째 미들웨어에서 요청을 처리함.");
res.send({name:'소녀시대', age:20});
next();
});


//Express 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express 서버를 시작했습니다. : '+ app.get('port'));
});




response 객체의 redirect 사용예제입니다.


//Express 기본 모듈 불러오기.

var express = require('express');
var http = require('http');

//Express 객체 생성
var app = express();

//기본포트를 app 객체에 속성으로 설정
app.set('port', process.env.PORT || 3000);



app.use(function(req, res, next){
console.log("첫번째 미들웨어에서 요청을 처리함.");
res.redirect('http://google.co.kr');
});


//Express 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express 서버를 시작했습니다. : '+ app.get('port'));
});


노드 서버를 실행후, 127.0.0.1:3000 으로접속하면 google로 redirect되는것을 확인하실 수 있습니다.






node.js middleware 사용


Middleware란 Client의 요청이 들어왔을 때 매번 수행되어야할 행위들을  말합니다.


미들웨어를 전부통과하고나서 적절한 response를 client에게 주도록 설계합니다.



//Express 기본 모듈 불러오기.

var express = require('express');
var http = require('http');

//Express 객체 생성
var app = express();

//기본포트를 app 객체에 속성으로 설정
app.set('port', process.env.PORT || 3000);

//첫번째미들웨어 등록
app.use(function(req, res, next){
console.log('첫 번째 미들웨어에서 요청을 처리함.');
req.user ='jinss';
next();
});
//두번째 미들웨어 등록
app.use('/', function(req, res, next){
console.log('두 번째 미들웨어에서 요청을 처리함.');
res.writeHead('200', {'Content-Type': 'text/html; charset=utf8'});
res.end('<h1>Express 서버에서' +req.user+'가 응답한 결과</h1>');
});


//Express 서버 시작
http.createServer(app).listen(app.get('port'), function(){
console.log('Express 서버를 시작했습니다. : '+ app.get('port'));
});


[서버실행 화면]



[웹브라우저 접속시 웹브라우저 화면]


[서버 콘솔 응답]



middleware 는 위에서 아래로 등록한 순서대로 실행을 타게 됩니다.


첫번째 middleware 에서는 req객체에 user속성을 추가하고 그값으로 문자열을 하나 넣습니다.

두번째 middleware에서 req객체에 설정된 user속성을 확인하여 사용자 정보를 사용할 수 있습니다.



참고>>

middleware 안에서는 기본적으로 요청 객체인 req와 응답객체인 res 객체를 Parameter로 전달받아 사용할수있습니다.



그리고 이 middleware함수를 호출한 app객체도 참조할수있습니다.

req.app 코드를 사용하면 app 객체 참조가능합니다.



middleware함수를 보면 요청 객체와 응답 객체가 파라미터로 전달되며, 그다음 middleware로

넘길 수 있는 next 함수 객체도 전달됩니다. 따라서 next 함수 객체를

실행하면 다음middleware로 넘길 수 있습니다.



middleware를 사용하기 위해서 먼저 use() 메소드를 호출해야하며, middleware 2개를 등록했습니다.



node.js (노드) get, post 요청 구현



http 모듈을 사용해 get 방식으로 다른 사이트 데이터를 요청하는 예제입니다.




var http = require('http');

var options ={
host: 'www.google.com',
port:80,
path: '/'
};

var req = http.get(options, function(res){
//응답처리
var resData = '';
res.on('data', function(chunk){
resData += chunk;
});

res.on('end', function(){
console.log(resData);
});

res.on('error', function(err){
console.log("오류발생: "+ err.message);
});

});



[결과화면]



http 객체 get() 메소드를 사용하면 다른 사이트에 요청을 보내고

응답을 받아 처리할 수 있습니다.


get()  메소드의 첫번째 파라미터는 다른 사이트의 정보를 담고있는 객체입니다. 그리고 두번째 parameter는 callback 함수 입니다.


응답 데이터를 받을떄는 data이벤트와 end 이벤트로 처리하면됩니다.


모두 resData 변수에 담아 두었고 event가 끝나는 시점에 console 창에 출력하게 됩니다.






post 방식

아래는 post방식입니다.



var http = require('http');

var opts = {
host: 'www.google.com',
port: 80,
method: 'POST',
path: '/',
header: {}
};


var resData = '';

var req = http.request(opts, function(res){
//응답처리
res.on('data', function(chunk){
resData += chunk;
});


res.on('end', function(){
console.log(resData);
});
});

opts.headers['Content-Type'] = 'application/x-www-form-urlencoded';
req.data = 'q=actor';
opts.headers['Content-Length'] = req.data.length;

req.on('error', function(err){
console.log("오류발생:"+ err.message);
})

//요청전송
req.write(req.data);
req.end();


 노드 기본 http 모듈을 사용하면 웹서버기능을 담당하는 서버 객체를만들 수 있습니다.



var http = require('http');

//웹서버 객체 생성
var server = http.createServer();

//웹서버를 시작하여 3000번 포트에서 대기합니다.
var port = 3000;
server.listen(port, function(){
console.log('웹 서버가 시작되었습니다. : %d', port);
});





node.js server 객체의 메소드


Method 이름 

 설명 

 listen(port, [hostname], [backlog], [callback]) 

 서버를실행하여 대기시킵니다.

 close([callback])   

 서버를 종료합니다.




var http = require('http');

//웹서버 객체 생성
var server = http.createServer();

//웹 서버를 시작하여 127.0.0.1 ip와 3000번 포트에서 대기하도록 설정
var host = '127.0.0.1';
var port = 3000;
server.listen(port, host, '50000', function(){
console.log("웹서버가 시작되었습니다.: %s, %d",host, port);
});






노드는 대부분 이벤트기반으로하는 비동기 방식으로 처리합니다. (callback method를 사용합니다.)

노드에는 이벤트를 보내고 받을수 있는 EventEmitter라는것이 있습니다.



EventEmitter   //부모 클래스


   상속!!(EventEmitter)   (     자식클래스객체 ---상속--> EventEmitter )


객체------------- //자식 클래스

  EventListener 객체   -   on() 리스너 등록, emit() 이벤트 전달

 -------------

  

노드 객체(자식객체)는 EventEmitter를 상속받을 수 있으며,  상속받은 후에는  EventEmitter 객체의 on()과 emit() 메소드를 사용할 수 있습니다.


또한 once()메소드도있습니다.



Method 명 

 설명

 on(event, listener)  

 지정한 이벤트의 리스너를 추가합니다.

 once(event, listener) 

 지정한 이벤트의 리스너를 추가하지만 한번 실행한 후에는 자동으로 리스너가 제거됩니다.

 removeListener(event, listener)

 지정한 이벤트에 대한 리스너를 제거합니다.


 

계산기 객체를 Event기능 추가한 모듈로 만들어보기


calc.js


var util = require('util');
var EventEmitter = require('events').EventEmitter;

var Calc = function(){
var self = this;
this.on('stop', function(){
console.log('Calc에 stop event 전달됨.');
});
};

util.inherits(Calc, EventEmitter);

Calc.prototype.add = function(a, b){
return a+b;
}

module.exports = Calc;
module.exports.title = 'calculator';


EventEmitter는 events모듈안에 정의되어이씁니다.

따라서 require()메소드를 호출하여 evnets모듈을 불러들인후,

그안에 속성으로 들어있는 EventEmitter 객체를 참조합니다.


Calc객체는 계산기 객체로서 function 키워드를 사용해 프로토타입객체로만듭니다.

 프로토타입 객체 안에서는 this키워드를 이용해 자기자신을 가리킬수있으며,

 그 객체 안에 정의된 속성에 접근할 수 있습니다.

 

그런다음 Calc 객체가 이벤트 처리를 할 수 있도록 EventEmitter를 상속하도록 만듭니다.


util모듈의 inherits()메소드를 사용하면 쉽게 상속을 구현할수있습니다.

Calc 객체는 EventEmiiter 객체를 상속받게 되었습니다.


main.js


var Calc = require('./calc');
var calc = new Calc();
calc.emit('stop');
console.log(Calc.title + ' 에 stop 이벤트 전달');

 



node.js 설치및 예제코드 작성해보는 시간을 가지겠습니다.



먼저 node.js 설치를 위해 다음의 공식 싸이트에 접속합니다.

https://nodejs.org/ko/download/



저는 아래그림처럼 window installer (.msi) 64-bit를 다운받고 실행하였습니다.



Next를 누릅니다.


Next를 누르시구요


설치가 진행됩니다.~!




설치가 끝났습니다.







예제코드 작성전에 Edit 프로그램을 또 다운받습니다. 

비쥬얼스튜디오코드  https://code.visualstudio.com/ 

해당 홈페이지의  download for window 를 클릭하여 받으신후 설치하시면 되겠습니다.



바탕화면에 꿩폴더를 만들고 그안에 app.js 파일을 생성합니다.


그리고 비쥬얼스튜디오 코드로 열어서 다음과 같이 작성합니다.



그 이후 꿩폴더에서 shift를 누른채 오른쪽 마우스를 클릭하시면, "여기서 명령창 열기"가 있습니다. 클릭해서 cmd 창을 뛰웁니다.



그다음 다음과 같이 명령을 칩니다.

> node app.js



화면과 같이 Hello node.js! 가 출력되면 성공적으로 node.js를 설치에 성공하신겁니다.

본격적으로 node.js 프로그래밍될 준비가 끝난겁니다.!


+ Recent posts