oris9

[Node.js] 미들웨어에 대해 알아보기 본문

Node.js

[Node.js] 미들웨어에 대해 알아보기

oris9 2024. 3. 2. 15:12

 

 

 

*** 기본적으로 웹 프레임워크에 뿐 아니라 소프트웨어 개발에 전반적으로 쓰이는 소프트웨어 컴포넌트 개념이며,
본 글은 express 중심으로 작성되었습니다 ***

 

 

 

미들웨어 (middleware) 란?

req(요청) 객체, res(응답) 객체, next (그다음의 미들웨어 함수를 호출하는 콜백함수) 3가지를 인자로 갖는 함수를 말한다.

app.use((req, res, next) => {

  return next() // next 뒤에 넣는 함수도 실제로 실행이 되기 때문에, 끊어주기 위해서 return을 넣어줌

})

의 형식을 가지고 있다.

즉 미들웨어란 클라이언트에게 요청이 오고, 그 요청을 보내기 위해 응답하려는 중간(미들)에 목적에 맞게 처리하는, 거쳐가는 함수라고 할 수 있다.

 

 

 

미들웨어의 특징

미들웨어는 순차적으로 처리 된다
(따라서 순서가 매우 중요하다. 또한 next를 마지막에 적지 않으면 다음 미들웨어나 라우트핸들러로 넘어가지 않는다.)
 
② 요청 객체(request)와 응답 객체(response)에 접근
 (req, res에 접근해 정보를 읽거나 조작함으로써 다양한 작업을 수행할 수 있다.)

③ 요청-응답 주기를 조작하거나 종료할 수 있다.

④ 체이닝(다양한 미들웨어 조합을 통한 모듈화, 재사용성 상승)과 에러처리

 

 

 

미들웨어 사용 예시

 

1) 기본 예시

// app.use는 모든 요청에 코드를 실행하게 함

app.use((req, res, next) => {

    req.requestTime = Date.now() // 데코레이트, 아래에서 사용할 수 있는 현재시간을 출력가능

    req.method = 'GET' // 모든 요청을 get으로 만들기 

    console.log(req.method, req.path); 

    next();

}



// 라우트핸들러처럼 문자열 혹은 경로도 전달가능

app.use("/dogs" , (req,res,next) => {    

    console.log()

    next()

} )



 (만약 api에 같은 단어로 시작하는 경로가 여러개잇다 치자. 앱하나에 모두 /api로 시작하는 내부라우트와

/author로 시작하는 승인이 필요한 라우트가 있다고 칩시다 특정 라우트나 경로에만 미들웨어를 실행하고싶은 경우

사용. 그리고 정규표현식을 이용하면 더 다양하게 응용이 가능하겠죠?)

 

2) 미들웨어 종료하기

// 미들웨어를 종료 (마지막에 넣어서 매칭되는게 없을때 종료되도록)

app.use((req, res) => {

	res.send("NOT FOUND") } 

 

// 미들웨어를 종료 (매칭되는게 없을 때 상태를 404로 만들고)

app.use((req, res) => {

	res.status(404).send("NOT FOUND") }

 

3) 사용자가 인증되었는지 확인하는 미들웨어

사용자 인증을 발급받게 되면 크리덴셜을 갖게됨

크리덴셜이 없는 사용자가 특정 라우트에 접근하지 못하게 하고 싶다면, 

인증을 받은 요청인지 확인할 수 있는 미들웨어를 만들어보자

 

(연습용가짜인증만들기)

const AppError = require로 불러오기

 

const verifyPassword =  (req, res, next) => {

    const {password} =req.query

    if (password === '비밀번호') {
    	next()
    }

 
	throw new AppError( 'Password required!', 401) // 권한이 없음을 알려주는 상태코드

}

 

app.get('/secret', verifyPassword, (req, res) => {

 res.send('비밀 사이트 🤭🤭🤭🤭 ')}

 

---------- AppError.js ---------- 

class AppError extends Error {

  constructor(message, status) {

     super();

     this.message=message;

     this.status = staues;   // express의 경우 err.status가 내장되어있기 때문에 상태코드로 바로들어갈수있음

    }

}

 

module.exports = AppError

 

 

'Node.js' 카테고리의 다른 글

[Node.js] 오류 처리, 에러핸들링  (0) 2024.03.03
[Node.js] Node.js 란?  (0) 2024.03.01
Express 라우터, 쿠키, 세션 플래시  (0) 2024.02.20
Mongoose express  (0) 2024.02.17
[Node] npm  (0) 2024.02.04