본문 바로가기
Coding/Etc

Node.js Middleware 구현 및 등록하는 방법

by Hide­ 2018. 7. 9.
반응형

Node.js에는 미들웨어(Middleware)라는 것이 존재한다.

단어의 뜻 그대로 요청 중간마다 거쳐가는 지점이라고 생각하면 이해가 쉬울 것 같다.

예를 들어 /test 로 요청을 했을 때 Main -> test로 들어가는 일반적인 구조가 있다고 가정해보자.

여기에 middle이라는 미들웨어를 추가하면 Main -> middle -> test 의 순서로 요청이 들어간다.

미들웨어는 상당히 유용하게 사용할 곳이 많다.

예를 들어 사용자의 요청이 들어올 때마다 로깅하는 시스템이 필요하다고 가정해보자.

먼저 middle.js라는 파일을 하나 생성한다.


const test = (req, res, next) => {
console.log("Middle");
next();
}

export default test;


그리고 위처럼 작성을 해준다. 3번째 인자는 next이다.

함수의 마지막 부분에 next()를 해줘야 스택에 저장되어 있는 다음 함수로 진입을 할 수 있다.

그리고 index.js에 아래의 라인을 추가한다.


import middleware from './middleware';

app.use(middleware);
app.get('/', (req, res) => {
res.send('hi');
})


반드시 라우팅이 선언된 부분 위쪽에 정의해줘야 해당 미들웨어를 먼저 거쳐갈 수 있다.

위와 같이 코드를 작성하고 /로 접속해보면 콘솔에 다음과 같이 로그가 찍히는것을 알 수 있다.



처음 미들웨어를 검색해본 계기는 JWT Token 인증을 구현할 때였다.

라우팅 함수를 통해 매 요청을 받을 때마다 JWT 토큰이 유효한지 검사를 해줘야 하는데,

매 함수마다 토큰이 유효한지 검사하는 라인을 추가한다면 상당히 비효율적인 코드일 것이다.

따라서 미들웨어에 Token verify함수를 등록함으로써 자동으로 모든 요청에 대해 검사하도록 만들었다.


const verify = (req, res, next) => {
try {
const token = req.headers.authorization.split(' ')[1];
if(token !== '1234') {
res.status(401).send('JWT Expired');
} else{
next();
}
} catch(e) {
res.status(401).send('Token does not exist');
}
}

export default verify;


간단하게 흐름만 표현하기 위해 실제 verify를 넣진 않았다.

단순히 토큰을 추출하고 1234인지 확인하는 루틴이다. 어차피 저 부분에 실제 jwt verify()를 사용해주면 똑같이 동작한다.

여기서 주의할점이 res.send() 이후에 next()를 해주면 안된다.

이미 index.js에서 특정 라우팅 때 Response를 보내도록 만들어 놨기때문에 응답을 중첩으로 보내면 


Error: Can't set headers after they are sent.


에러가 발생한다.

예전에는 이미 만들어진 미들웨어만 등록해서 사용하다가 간단하게나마 직접 만들어서 사용해봤는데 상당히 유용한 기능이라는 생각이 든다.