본문 바로가기

Node.js공부/Node.js 원활한 사용을 위한 세부 공부

미들웨어 사용하기

반응형

이전 글에서는  use() 메소드로 설정하는 미들웨어 함수 안에 코드를 직접 넣어 클라이언트로 응답을 전송해 보았습니다. 개발자를 위한 몇 가지 기본 미들웨어에 대해서 더 알아 보겠습니다!


1. static 미들웨어

먼저 static 미들웨어는 특정 폴더의 파일들을 특정 패스로 접근할 수 있도록 만들어 줍니다. 밑의 코드는 [public] 폴더에 있는 모든 파일을 웹 서버의 루트 패스로 접근할 수 있도록 만들어 줍니다.


var static = require('serve-static');

...

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


static 미들웨어는 외장 모듈로 만들어져 있기 때문에 설치가 필요합니다. 커맨드 창에  $ npm install serve-static - -save 를 입력하여 주세요.


다시 돌아가서, public폴더 안에 index.html 파일이 있었다고 가정한 후에 위의 코드를 실행하게 되면 http://localhost:3000/index.html 으로도 바로 접근이 가능하게 됩니다. 


만약 [public] 폴더 안에 있는 파일을 사이트의 /public 패스로 접근하도록 만들고 싶다면, static() 메소드를 호출할 때 다음과 같이 패스를 지정해주면 됩니다.

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


이렇게 하면 요청 패스와 특정 폴더가 맵핑되어 접근할 수 있습니다.




2. body-parser 미들웨어

POST 방식으로 요청할 때는 본문인 본문영역(Body영역)에 요청 파라미터가 들어있게 되므로 요청 파라미터를 파싱하는 방법이 GET 방식과 달라집니다. body-parser 미들웨어는 클라이언트가 POST 방식으로 요청할 때 본문 영역에 들어있는 요청 파라미터들을 파싱하여 요청 객체의 body속성에 넣어 줍니다. 


body-parser 모듈을 사용하기 위한 설정은 두 줄입니다. app 객체의 use() 메소드를 사용해 미들웨어를 설정하는데 bodyParser.urlencoded() 메소드를 호출하면서 미들웨어를 설정하면 application/x-www-form-urlencoded 형식으로 전달된 요청 파라미터를 파싱할 수 있습니다. bodyParser.json() 메소드를 호출하면서 미들웨어를 설정하면 application/json 형식으로 전달된 요청 파라미터를 파싱할 수 있습니다. 


이렇게 하면 사용자 요청을 처리하는 미들웨어 안에서 요청 객체의 body 객체 안에 요청 파라미터들이 들어갑니다. 즉, 다음 코드를 사용해 요청 파라미터를 참조할 수 있습니다. 이제 GET 방식으로 요청했을 때와 마찬가지로 POST 방식으로 요청했을 때도 요청 파라미터를 확인할 수 있게 되었습니다. 


여기서 잠깐~!  요청 값 구분하기

1. req.params

- URL에서 변수로 넘어온 값

- 어떤 대상 자체를 조회/수정/삭제 할 때 파라미터로 대상의 id 를 전달

예) public_IP/articles/123 -> articles/:id    req.params.id에는 123이 담겨있음.

2. req.query

- URL에서 쿼리문자열로 넘어온 값

- 어떤 대상의 속성을 가지고 대상을 조회 할 때 쿼리 문자열로 속성을 전달

예) GET public_IP/articles?wrtier='코엘리' &department='server'

-> req.query.writer, req.query.department로 가져옴

3. req.body

- body로 넘어온 값

- 어떤 대상을 새로 저장/수정 할 때 body로 저장/수정할 값을 전달( POST )

예) {writer: '코엘리', department: 'server'}

-> body-parser를 이용하여 req.body.writer, req.body.department로 가져옴.



3. express-error-handler 미들웨어로 오류 페이지 내보내기

예상하지 못한 오류가 발생했을 때 그 오류를 처리할 수 있는 미들웨어를 사용할 수 있습니다. express-error-handler 미들웨어를 사용해 404.html 페이지를 응답으로 보낼 수 있습니다. express-error-handler 모듈은 특정 오류 코드에 따라 클라이언트로 응답을 보내 줄 때 미리 만들어 놓은 웹 문서를 보내 줄 수 있습니다. 이 모듈은 외장 모듈이므로 $ npm install express-error-handler --save 를 커맨드창에서 입력후, 코드의 맨 위쪽에서 require() 메소드를 호출하여 모듈을 불러줍니다. 오류 페이지는 모든 라우터 처리가 끝난 후 처리되어야 합니다. 따라서 서버를 시작하기 위해 호출하는 코드 위쪽에 미들웨어로 추가합니다.  프로젝트 안 public 폴더 안에 404.html 파일을 만들고 그 안에 오류 표시를 위한 코드를 입력합니다. 


404.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>오류 페이지</title>
</head>
<body>
<h3>ERROR-페이지를 찾을 수 없습니다.</h3>
<hr />
<p>/public/404.html 파일의 오류 페이지를 표시한 것입니다.</p>
</body>
</html>


app.js

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

...

var errorHandler = require('errorhandler');

//오류 핸들러 모듈 사용
var expressErrorHandler = require('express-error-handler');
var static = require('serve-static');

...


var errorHandler = expressErrorHandler({
static:{
'404': './public/404.html'
}
});


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

http.createServer(app).listen(app.get('port'), function(){
console.log('서버가 시작되었습니다. 포트: '+app.get('port'));
});





localhost로 아무 경로로 들어가게 되면 다음과 같은 페이지가 뜨게 됩니다.


4. 요청 라우팅하기

만약에 로그인 처리와 사용자 리스트 요청도 use() 메소드로 설정한 메소드를 부르게 되면, 요청 url이 무엇인지 일일이 확인해야 하는 번거로움이 생깁니다. 요청 url을 일일이 확인해야 하는 번거로운 문제를 해결하는 것이 라우터 미들웨어(router middleware)입니다.


라우터 미들웨어는 익스프레스에 포함되어 있습니다. 이 라우터를 사용하게 되면 사용자가 요청한 기능이 무엇인지 패스를 기준으로 구별하기 때문에 매우 중요합니다. 라우터 미들웨어를 사용하려면 익스프레스 객체에서 라우터 객체를 참조해서 사용합니다. 


클라이언트에서 요청한 요청 패스에 따라 실행될 함수는 라우터(router) 객체를 사용해 등록합니다. router 객체에는 route() 메소드가 있어 요청 패스를 지정할 수 있으며, get() 이나 post() 메소드를 호출하면 실행될 함수를 등록할 수 있습니다.


//라우터 객체 참조

var router - express.Router();


//라우팅 함수 등록

router.route('/process/login').get(...);

router.route('/process/login').post(...);


//라우터 객체를 app객체에 등록

app.use('/', route);



반응형