[Node.js][TIL] Middle ware 미들웨어란?

Trippy·2023년 11월 9일
0

Node.js

목록 보기
10/28
post-thumbnail

Middle ware란?

미들웨어는 express의 핵심이다. 요청과 응답의 중간에 위치하기 때문에 미들웨어라고 부르는 것이다.

RouterError handler 또한 미들웨어의 일종이므로 미들에어가 익스프레스의 전부라고 해도 과언이 아니다.

미들웨어는 요청과 응답을 조작해 기능을 추가하기도 하고, 나쁜 요청을 걸러내기도 한다.

익스프레스 내에서 웹 요청과 응답에 대한 정보를 사용해서 필요한 처리를 진행할 수 있도록 분리된 독립적인 함수이다.

요청과 응답의 중간에 위치하여 미들웨어
미들웨어는 req, res, next가 매개변수인 함수
미들웨어 함수를 여러번 인자로 쓸 수 있음
req: 요청, res: 응답 조작 가능, next()로 다음 미들웨어로 넘어감.


Middle ware 기본 작성 예제

const express = require('express');


/* 1. 앱을 만든다. */
const app = express();


/* 2. 앱에 관련 설정 속성들을 만든다. */
app.set('port', process.env.PORT || 3000);


/* 3. 공통 미들웨어를 만든다. */
app.use((req, res, next) => {
    console.log('모든 요청에 다 실행됩니다.');
    // next라는 세 번째 매개변수는 다음 미들웨어로 넘어가는 함수이다.
    // next를 실행하지 않으면 다음 미들웨어가 실행되지 않는다.
    next(); 
})


/* 4. 라우터들을 만든다. */

// /error 요청 올때 동작
app.get('/error', (req, res, next) => {
    next(); // next()에 인수가 없다면, 바로 다음 미들웨어 함수로 넘어가게 된다. 
    
}, (req, res) => { // 미들웨어를 여러개 넣어줘도 된다. 위에서 next()되면 실행 된다.
	try {
    	// .. 에러 발생 코드
    } catch(err) {
    	error(err); // next()에 인수가 있다면, 에러 처리 미들웨어로 점프하게 된다. 
    }  
});

// /about 요청 올때 동작
app.get('/about', (req, res) => {
   res.send('Hello, about');
});

// 주소 부분에는 정규표현식, : (콜론)을 사용한 와일드 카드도 적용이 가능하다 :변수명 정도로 생각하면 된다.
// 와일드 카드를 사용할때는 다른 라우터 보다 뒤에 적어주는 것이 좋다
app.get('/category/:name', (req, res) => {
   res.send(`Hello, ${req.params.name}`);
});

// 모든 종류의 get요청이 올때 동작
app.get('*', (req, res) => {
   res.send('Hello, get !!');
});

// post 요청 올때 동작
app.post('/', (req, res) => {
   res.status(200).send('Hello, Post');
});


/* 5. 에러 처리 미들웨어를 만든다. */
app.use((err, req, res, next) => { // 에러 미들웨어는 인자는 반드시 4개 선언
    console.error(err);
    res
    	.status(500)
        .send(err.message); 
})


/* 6. 포트를 연결하여 서버를 실행한다. */
app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기 중.');
});

app.use()

app.use()는 Express 앱에서 항상 실행하는 미들웨어 역할.

app.get(), app.post()등과 같이 요청 URL을 지정하지 않아도 app.use()를 사용할 수 있으며 해당 경우에는 URL에 상관없이 매번 실행된다.

app.use() 및 app.Method()함수를 이용해 응용프로그램 수준의 미들웨어를 app객체의 인스턴스에 바인딩Method = get or post

미들웨어설명
app.use(미들웨어)모든 요청에서 미들웨어 실행
app.use('/abc', 미들웨어)abc로 시작하는 요청에서 미들웨어실행
app.post('/abc', 미들웨어)abc로 시작하는 post요청에서 미들웨어 실행

에러 처리 Middle ware

...

app.get('/error', (req, res, next) => {
    next(); // next()에 인수가 없다면, 바로 다음 미들웨어 함수로 넘어가게 된다. 
}, (req, res) => { 
	try {
    	// .. 에러 발생 코드
    } catch(err) {
    	error(err); // next()에 인수가 있다면, 에러 처리 미들웨어로 점프하게 된다. 
    }  
});

...

// 에러 미들웨어는 인자는 반드시 4개 선언
app.use((err, req, res, next) => { 
    console.error(err);
    res
    	.status(500)
        .send(err.message); 
})

app.get에는 미들웨어(콜백함수)가 두 개 연결되어 있다.
next를 호출하면 바로 다음 미들웨어로 점프하게 된다.

그리고 두 번째 미들웨어에서 catch로 에러를 잡으면 바로 에러 처리 미들웨어로 점프하게 된다

에러 처리 미들웨어는 매개변수가 err, req, res, next로 네 개다

모든 매개변수를 사용하지 않더라도 반드시 네 개여야 한다.


Middle ware next()

next()를 하면 미들웨어로 넘어가고, next(인수)를하면 에러 핸들러로 넘어가게 된다.

또한, 한가지 특별한 기능이 있는데 next('route')를 하게 되면 다음 미들웨어가 아닌 다음 라우터로 넘어가게 된다.

...

app.get('/', (req, res, next) => {
    if (false) {
    	next(); // 다음 미들웨어로 넘어간다.
    } else {
    	next('route'); // next()에 'route'인수를 주게되면, 다음 미들웨어가 아닌, 다음 라우터로 넘어가게 된다. 
    }
    
}, (req, res) => { 
	// ... next()면 실행되지만,
	// ... next('route')면 실행되지 않는다.
});


app.get('/', (req, res, next) => { 
	// ... next('route')면, 그 다음 라우터인 이쪽이 실행된다.
})

또한 미들웨어는 아래와 같이 동시에 여라개의 미들웨어를 사용할 수 있다.

app.use(
    morgan('dev'),
    express.static('/', path.join(__dirname, 'public')),
    express.json(),
    express.urlencoded({ extended: false }),
    cookieParser(process.env.COOKIE_SECRET)
);

위 미들웨어들은 내부적으로 next를 호출하므로 연달아 쓸 수 있다.
next를 호출하지 않는 미들웨어는 res.sendres.sendFile 등의 메서드로 응답을 보내야한다.

출처

https://inpa.tistory.com/entry/EXPRESS-📚-미들웨어-💯-이해-정리 [Inpa Dev 👨‍💻:티스토리]

https://www.zerocho.com/ Node.js 교과서 -조현영 지음

profile
감금 당하고 개발만 하고 싶어요

0개의 댓글