oris9
[Node.js] 미들웨어에 대해 알아보기 본문
*** 기본적으로 웹 프레임워크에 뿐 아니라 소프트웨어 개발에 전반적으로 쓰이는 소프트웨어 컴포넌트 개념이며,
본 글은 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 |