[express 모듈과 함께 사용할 수 있는 미들웨어]
router : 페이지 라우트를 수행
static : 특정 폴더를 서버의 루트 폴더에 올림
morgan : 로그 정보를 출력
cookie parser : 쿠키 해석
body parser : post 요청 매개변수를 추출
connect-multiparty : post 요청 매개변수 추출
express-session : 세션 처리를 수행
csurf : CSRF보안을 수행
error handler : 예외 처리를 수행
limit : post 요청 데이터를 제한
vhost : 가상 호스트 설정
[router 미들웨어]
http 모듈을 사용하여 페이지 라우팅을 할 때
//pathname 변수 선언
var pathname = url.parse(req.url).pathname;
//페이지 구분
if( pathname == '/' ){
}else if( pathname == '/board' ){
}
http 모듈을 사용했을 때, 위 코드처럼 if조건문으로 페이지 라우팅을 구현했었지만
router 미들웨어를 사용하면 페이지 라우팅을 쉽게 구현할 수 있다.
router 미들웨어는 app 객체의 메서드를 사용할 수 있다.
app 객체의 메서드
get( path, callback[, callback ...] ) : GET 요청이 발생했을때의 이벤트 리스너를 지정
post( path, callback[, callback ...] ) : POST 요청이 발생했을때의 이벤트 리스너를 지정
put( path, callback[, callback ...] ) : PUT 요청이 발생했을때의 이벤트 리스너를 지정
delete( path, callback[, callback ...] ) : DELETE 요청이 발생했을때의 이벤트 리스너를 지정
all( path, callback[, callback ...] ) : 모든 요청이 발생했을때의 이벤트 리스너를 지정
router 미들웨어를 사용하여 페이지를 라우팅
//라우터 설정 app.get('/board', function(req, res){ res.send('<p>board page</p>'); }); //라우터 설정 및 매개변수 추출 // params 속성 : /:num 처럼 : 기호를 사용해 지정된 라우팅 매개변수 // query : ?test=1 같은 요청 매개변수 app.get('/page/:num', function(req, res){ var num = req.params.num; //http://127.0.0.1/page/123 으로 접속시 '123 page' 출력 res.send(''+ num +' page
'); });
[static 미들웨어]
웹서버에서 정적 파일을 제공해 주는 미들웨어로, static 미들웨어를 사용하면
지정한 폴더에 있는 내용을 웹 서버 루트 폴더에 올린다.
static 미들웨어를 사용한 이미지 표기
//미들웨어 설정 app.use(express.static(__dirname + '/img')); // __dirname : 디렉토리 이름을 알아내는 전역변수 app.use(function(req, res){ res.writeHead(200, { 'Content-Type' : 'text/html' }); res.end('<<mg src="/test_img.png" alt="test image">'); });
[morgan 미들웨어]
웹 요청이 들어왔을때 로그를 출력해주는 미들웨어로, router나 static 모듈과는 다르게 따로 설치를 해주어야 한다.
morgan 모듈 설치
npm install morgan
morgan 미들웨어 사용
//모듈 추출 var morgan = require('morgan'); //미들웨어 설정 app.use(morgan('combined')); // <-- morgan의 기본형식으로 combined 외에 common, dev, short, tiny 등이 있다. app.use(function(req, res){ res.send('<p>test morgan~~ </p>'); });
[cookie parser] 미들웨어
요청 온 쿠키를 추출하는 미들웨어로, cookie parser 미들웨어를 사용하면
request, response 객체에 cookie속성과 cookie() 메서드가 부여된다.
cookie parser도 외부 모듈이므로 별도로 설치를 해줘야 한다
cookie parser 모듈 설치
npm install cookie-parser
cookie() 메서드의 옵션
httpOnly : 클라이언트의 쿠키 접근 권한을 지정
secure : secure 속성을 지정
expires : expires 속성을 지정
maxAge : expire 속성을 상대값으로 지정
path : path 속성 지정
쿠키 생성 및 읽기
//모듈 추출 var cookieParser = require('cookie-parser'); //미들웨어 설정 app.use(cookieParser()); //라우터 설정 app.get('/read_cookie', function(req, res){ //쿠키 읽기 res.send(req.cookie); }); //쿠리 생성 app.get('/set_cookie', function(){ res.cookie('string', 'cookie'); res.cookie('json', { name : 'cookie', property : '1234' }); //쿠키 생성 후 쿠키를 읽는 read_cookie 페이지로 이동 res.redirect('/read_cookie'); });
[body parser 미들웨어]
POST 요청 데이터를 가져오는 미들웨어. body parser 모듈도 외부 모듈이므로 별도의 설치가 필요하다.
body parser 모듈 설치
npm install body-parser
body parser의 테스트로 post로 넘긴 값을 출력
HTML 파일
<form method="post">
<input type="text" name="test_text" />
<input type="submit" name="test_btn">
</form>
서버 기본설정
//모듈 추출 var fs = require('fs'); var express = require('express'); var bodyParser = require('body-parser'); //서버 생성 var app = express(); var hostname = 'localhost'; var port = 3000; //미들 웨어 설정 //'application/x-www-form-urlencoded' 파싱 //(파일 전송을 위한 multipart/form-data 인코딩은) 나중에 multipart 미들웨어를 사용. app.use(bodtParser.urlencoded({ extended : false })); //application/json 파싱 app.use(bodyParser.json()); //라우터 설정 app.use('/test_page', function(req, res){ //post 값 읽기 var test_text = req.body.test_text; //출력 res.writeHead('200', { 'Content-type' : 'text/html' }) res.write('test_text : '+ test_text +'
'); res.end(); }); //서버 실행 app.listen(port, function(){ console.log('Server running at http://'+hostname+':'+port); });
[connect-multiparty 미들웨어]
일반적인 데이터 전송은 'application/x-www-form-urlencoded' 인코드 방식을 사용하지만
파일 업로드 같이 용량이 큰 파일 전송은 'multipart/form-data' 인코딩 방식을 사용하는데,
이 인코딩 방식을 사용할 수 있게 해주는 미들웨어가 connect-multiparty 미들웨어다.
connect-multiparty 모듈 설치
npm install connect-multiparty
connect-multiparty 미들웨어를 사용한 이미지파일 업로드 구현
html 파일
<form method="post" enctype="multipart/form-data"> <!-- 반드시 enctype 속성을 multipart/form-data 로 지정 --> <pgt;이미지파일 업로드</p> <input type="file" name="file_upload" /> <input type="submit" /> </form>
서버 설정
//모듈 추출 var fs = require('fs'); var express = require('express'); var multipart = require('connect-multiparty'); var hostname = 'localhost'; var port = 3000; //서버 생성 var app = express(); //미들웨어 설정 app.use(multipart({ uploadDir : __dirname + '/multipart' })); //라우터 설정 app.get('/', function(req, res){ fs..readFile('htmlpage.html', function(error, data){ res.send(data.toString()); }); }) //파일업로드 시 request 객체에 files 속성이 추가된다. app.post('/', function(req, res){ var file = req.files.image; //파일이 있는 경우 if(file){ //파일의 이름, 경로, 확장자 변수 설정 var name = file.name; var path = file.path; var type = file.type; //이미지 파일 확인 if(type.indexOf('image') != -1){ //중복된 파일명을 피하기 위해 파일명 변경 var outputPath = _dirname + '/multipart/' + Date.now() + '_' + name; fs.rename(path, outputPath, function(error){ res.redirect('/'); }); //이미지 파일이 아닌 경우 파일 제거 }else { fs.unlink(path, function(error){ res.sendStatus(400); }); } //파일이 없을 경우 }else { res.sendStatus(404); } res.redirect('/'); }); //서버 실행 app.listen(post, function(){ console.log('Server running at http://'+hostname+':'+port); })
[express-session 미들웨어]
세션 정보를 쉽게 사용할 수 있는 모듈
session 객체의 메서드
regenerate() : 세션을 다시 생성
destory() : 세션을 제거
reload() : 세션 다시 불러오기
save() : 세션을 저장
express-session 설치
npm install express-session
session 미들웨어
//미들웨어 설정 app.use(session({ secret : 'test key', // <-- 비밀 키를 저장 resave : false, // <-- 세션에 변경되지 않았어도 세션 저장소에 반영할지 설정 saveUninitialized : true; // <-- 초기화되지 않은 세션을 세션 저장소에 저장할지 여부 설정 //store : // <--세션 저장소를 지정 //cookie : // <-- 생성할 cookie관련 정보를 지정 //name : // <-- 쿠키의 name 속성을 지정 })); app.use(function(req, res){ //세션을 저장 req.session.now = (new Date()).toUTCString(); //세션 응답 res.send(req.session); })
'Web > Node.js' 카테고리의 다른 글
express 프레임워크 (0) | 2018.03.12 |
---|---|
mysql module (0) | 2018.03.12 |
express module - request, response 객체 (0) | 2018.03.06 |
http module (server, request, response, cookie) (0) | 2018.03.02 |
Node js Email Send (0) | 2018.03.02 |
댓글