티스토리 뷰

개발공부/🟩 Node.js

[NodeJS] Express.js의 Middleware

2022. 7. 28. 18:40

 

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 

 

 Middleware 

 

▶ 미들웨어(Middleware) 란?

 

HTTP 요청과 응답 사이에서 단계별 동작을 수행해주는 함수

 

- HTTP 요청이 들어온 순간부터 시작됨

- 미들웨어는 HTTP 요청과 응답 객체를 처리하거나 다음 미들웨어를 실행

- HTTP 응답이 마무리될 때까지 미들웨어 동작 사이클이 실행

 

이미지출처 : 엘리스 Node.js와 MongoDB Ⅰ - 04 Express.js와 REST API 강의자료

 

 

 

▶ Middleware 작성법

 

req, res, next 를 인자로 갖는 함수를 작성하면 해당 함수는 미들웨어로 동작할 수 있음

- req  :  HTTP 요청을 처리하는 객체

- res  :  HTTP 응답을 처리하는 객체

- next  :  다음 미들웨어를 실행하는 함수

 

req, res 객체를 통해 HTTP 요청과 응답을 처리하거나 next 함수를 통해 다음 미들웨어를 호출

const logger = (req, res, next) => {
    console.log(`Request ${req.path}`);
    next();
}

const auth = (req, res, next) => {
    if (!isAdmin(req)) {
        next(new Error('Not Authorized'));
        return;
    }

    next();
}

! next() 함수가 호출되지 않으면 미들웨어 사이클이 멈춰서 HTTP 요청과 응답이 제대로 처리되지 않으니 주의

 

 

* Route Handler도 미들웨어의 한 종류

: Route Handler는 라우팅 함수 (get, post, put, delete 등) 에 적용된 미들웨어로,

일반적인 미들웨어와는 다르게 path parameter 를 사용할 수 있음

 

 

 

 

▶ Middleware 사용법

 

: 미들웨어는 적용되는 위치에 따라 어플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어로 분류 가능

→  필요한 동작 방식에 따라 미들웨어를 적용할 위치 결정

 

 

1) 어플리케이션 미들웨어

:  app객체에 use나 http method함수를 사용하여 연결한 미들웨어

 

-  미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법

-  HTTP 요청이 들어온 순간부터 적용된 순서대로 동작

app.use((req, res, next) => {			// 실행순서 1
    console.log(`Request ${req.path}`);
    next();
});

app.use(auth);					// 2

app.get('/', (req, res, next) => {		//3
	res.send('Hello Express');
});

 

 

2) 라우터 미들웨어

:  미들웨어가 router객체에 적용되는 것 외에는 어플리케이션 미들웨어와 사용방법은 동일

 

-  특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법

-  app 객체에 라우터가 적용된 이후 순서대로 동작

router.use(auth);				//3

router.get('/', (req, res, next) => {		//4
	res.send('Hello Router');
});								

app.use((req, res, next) => {			// 실행순서 1
    console.log(`Request ${req.path}`);
    next();		
});

app.use('/admin', router);			// 2

 

 

3) 미들웨어 서브스택

:  use 나 http method 함수에 미들웨어를 적용할 때 한번에 여러개의 미들웨어를 동시에 적용

 

-  주로 한 개의 경로에 특정해서 미들웨어를 여러개로 적용하기 위한 방법

-  전달된 인자 순서대로 동작

app.use(middleware1, middlware2, ...);	// 실행순서 middleware1 -> middlware2 -> ...

app.use('/admin', auth, adminRouter);

app.get('/', logger, (req, res, next) => {
	res.send('Hello Express');
});

 

 

4) 오류처리 미들웨어

:  err, req, res, next 네가지 인자를 가지는 미들웨어

 

-  일반적으로 가장 마지막에 위치함

-  이전에 적용된 미들웨어 중 next 에 인자를 넘기는 경우 중간 미들웨어들은 뛰어넘고 오류처리 미들웨어가 바로 실행

app.use((req, res, next) => {
    if (!isAdmin(req)) {
        next(new Error('Not Authorized'));	// next에 Error를 인자로 넘기면
        return;
    }
    next();
});

app.get('/', (req, res, next) => {		// 이 미들웨어는 뛰어넘고
	res.send('Hello Express');
});

app.use((err, req, res, next) => {		// 오류처리 미들웨어 실행
	res.send('Error Occurred');
});

 

 

5) 함수형 미들웨어

:  하나의 미들웨어를 작동모드를 선택하면서 사용하고 싶은 경우 미들웨어를 함수형으로 작성하여 사용 가능

(ex. API 별로 사용자의 권한을 다르게 제한하고 싶은 경우)

 

-  아래 auth 함수는 미들웨어 함수를 반환하는 함수

-  auth 함수 실행 시 미들웨어의 동작이 결정되는 방식으로 작성된 코드

-  일반적으로 동일한 로직에 설정값만 다르게 미들웨어를 적용하고 싶을 경우 사용

const auth = (memberType) => {
    return (req, res, next) => {
        if (!checkMember(req, memberType)) {
            next(new Error(`member not ${memberType}`));
            return;
    	}
    	next();
    }
}

app.use('/admin', auth('admin'), adminRouter);
app.use('/users', auth('member'), userRouter);

 

 

 

 

▶ Middleware Libraries (미들웨어 라이브러리)

 

Express.js 는 다양한 미들웨어들이 이미 만들어져 라이브러리로 제공

유용한 미들웨어를 npm을 통해 추가하여 사용 가능

Express.js 홈페이지나 npm 온라인 저장소에서 찾아볼 수 있음

 

 

 

 

 

 

 

 


 이 글은 엘리스 AI트랙 5기 강의를 들으며 정리한 내용입니다.

반응형

'개발공부 > 🟩 Node.js' 카테고리의 다른 글

[NodeJS] Node.js와 MongoDB  (0) 2022.07.31
[NodeJS] Express.js로 REST API 구현하기  (0) 2022.07.30
[NodeJS] 웹과 Express.js  (0) 2022.07.27
[NodeJS] NPM과 모듈  (0) 2022.07.27
[NodeJS] Node.js 이해하기  (0) 2022.07.26
프로필사진
개발자 삐롱히

프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그