[모듈과 미들웨어란]
- 모듈 : 기본적으로 제공하는 기능 뿐 아니라 추가적으로 기능을 사용할 때 가져다 쓸 수 있는 라이브러리
1) 내장 모듈 : nodejs에서 제공하는 모듈
2) 확장 모듈 : nodejs 사용자들이 만들어낸 모듈
- 미들웨어 : 구조 내에서 중간 처리를 위한 함수(함수들의 꾸러미가 모듈)
1) express 프레임워크에서 사용할 수 있는 중간 처리 목적의 소프트웨어 : 기본적인 express 구조 내에서 처리 목적으로 사용
2) 요청에 대한 응답을 완수하기 전까지 중간중간 다양한 일을 처리할 수 있음
3) 미들웨어 함수 생명주기 : request - response 응답을 주기로 종료
4) 미들웨어 함수 우선순위 : 먼저 로드되는 미들웨어 함수가 먼저 실행됨(코드 순서 중요)
1 2 3 4 5 6 7 8 | /* app.js */ var upload = require('./routes/upload'); app.use('upload', upload); /* ./routes/upload.js */ router.get('/', function (req, res, next) { res.render('upload', { title: "파일 업로드" }); }); | cs |
- upload.js : function(req, res, next) HTTP get 메서드 + '/upload'가 요청이 발생했을 때 중간처리하는 미들웨어함수
- app.js : 미들웨어함수를 로드하기위해 app.use
- 요청이 발생했을 때 미들웨어 함수 실행, 응답 후 미들웨어 함수 죽음
[미들웨어 함수 유형 및 사용]
2) 미들웨어의 레벨 유형 : 미들웨어가 다뤄지는 영역마다 조금씩 정의하는 차이가 있음
2-1) 어플리케이션 : 어플리케이션 전체 영역에서 처리 가능, 앱에 대한 request가 발생할 때마다 실행되는 미들웨어
- app.use() 과 app.METHOD() : 미들웨어 함수를 로드하기 위해서 호출해야함, METHOD: get, post 같은 HTTP 메서드
2-2) 라우터 : 라우터 단위로 request가 발생하면 실행, 특정 지정 라우트가 실행되었을 때마다 실행되는 미들웨어
1 2 3 4 5 6 | var app = express(); var router = express.Router(); router.get('/', function (req, res, next) { }); | cs |
- express().Router() 인스턴스에 바운드됨, 동작 방식은 같음
- get 라우트 함수의 두번째 인자 function이 미들웨어 함수
- 미들웨어함수 파라미터 : req(HTTP 요청), res(HTTP 응답),
- req, res를 가지고 요청, 응답에 대한 변경 및 처리를 할 수 있음
- 어플리케이션 레벨에서 require해서 사용
2-3) 에러 핸들링 : 에러가 발생하면 핸들링할 때 사용하는 미들웨어
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); | cs |
- 에러 핸들링 미들웨어는 4개의 인수(err, req, res, next)를 가짐
- 에러가 캐치되면 위의 미들웨어 함수가 호출됨 : next(인수, 함수) 함수를 호출하지않으면 그 상태에 머무르게 됨
- 위와 같이 app.use(function()) : 아무런 주소가 지정되어있지않음, 지정되어있는 주소 이외에는 모두 에러 처리하겠다는 것
그래서 next(); 함수를 호출하여 다음 미들웨어 함수로 넘김 : 에러 캐치와 에러 메세지를 분석해서 랜더링 하는 함수를 따로 둠
- 아래와 같이 next로 함수를 호출하지않을 경우 그 다음 미들웨어 함수로 넘어가지않음
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; }); app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); | cs |
3-4) 써드파티 미들웨어
- 어플리케이션, 라우터 레벨에서 써드파티 미들웨어 설정 가능
- express는 대부분 써드파티 미들웨어 사용을 권고
- npm으로 다운로드
- 오늘 포스팅할 multer 또한 써드파티 미들웨어
[참고자료]
- express 공식홈페이지, 미들웨어 작성 : http://expressjs.com/ko/guide/writing-middleware.html
- express 공식홈페이지, 미들웨어 사용 : http://expressjs.com/ko/guide/using-middleware.html
'nodejs' 카테고리의 다른 글
[node.js] http 모듈로 간단하게 유저 API 서버 만들기 (0) | 2017.06.05 |
---|---|
[node.js] 기본 - processing model, module system, async] (0) | 2017.06.04 |
[node.js]Supervisor로 웹서버 자동 재시작하기 (0) | 2017.05.15 |
[node.js] express 로그인 정보 전달하기 (0) | 2017.05.15 |
[node.js] express 그리고 템플릿엔진 ejs (0) | 2017.05.01 |
댓글