본문 바로가기
NodeJS

[NodeJS] 익스프레스 자주 사용하는 미들웨어

by Yeoseungwon 2023. 7. 1.
728x90

미들웨어는 익스프레스의 핵심이다. 

요청과 응답의 중간에 위치하기 때문에 미들웨어라고 부른다. 

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

 

미들웨어는 app.use와 함께 사용된다. app.use(미들웨어) 꼴이다. 

 

 

익스프레스 서버에 미들웨어 연결해보기

const express = require('express');
const path = require('path');

const app = express();
app.set('port', process.env.PORT || 3001); 

app.use((req, res, next) => {
    console.log('모든 요청에 다 실행됩니다. ');
    next();
});

app.get('/', (req, res, next) => {
    console.log('GET / 요청에서만 실행됩니다.');
    next();
}, (req, res) => {
    throw new Error('에러는 에러 처리 미들웨어로 갑니다. ')
});

app.use((err, req, res, next) => {
    console.error(err);
    res.status(500).send(err.message);
});

app.listen(app.get('port'), () => {
    console.log(app.get('port'), '번 포트에서 대기 중..');
});

 

app.use에 매개변수가 req, res, next 인 함수를 넣으면 된다. 

next라는 세 번째 매개변수를 사용했는데, 다음 미들웨어로 넘어가는 함수이다. next를 실행하지 않으면 다음 미들웨어가 실행되지 않는다.

 

주소를 첫 번째 인수로 넣어주지 않는다면 미들웨어는 모든 요청에서 실행되고, 주소를 넣는다면 해당하는 요처에서만 실행된다. 

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

 

app.use나 app.get 같은 라우터에 미들웨어를 여러 개 장착할 수 있다. 

현재 app.get라우터에 미들웨어가 두 개 연결되어 있다. 다만, 이때도 next를 호출해야 다음 미들웨어로 넘어갈 수 있다. 

 

현재 app.get('/') 의 두 번째 미들웨어에서 에러가 발생하고, 이 에러는 그 아래에 있는 에러 처리 미들웨어에 전달된다. 

에러 처리 미들웨어는 매개변수가 err,req,res,next 로 네 개 이다. 모든 매개변수를 사용하지 않더라도 매개변수가 반드시 네 개 여야한다. 

 

res.status메서드로 http상태 모드를 지정할 수 있다. 기본값은 200 (성공)

 

콘솔
브라우저

throw new Error 가 화면에 나타나는 이유

throw new Error 문장은 에러를 발생시키는 JavaScript 구문입니다. 위의 코드에서, / 경로로 들어오는 GET 요청에 대한 핸들러에서 throw new Error('에러는 에러 처리 미들웨어로 갑니다. ') 구문이 사용되었습니다.

이 구문은 현재 요청을 처리하는 핸들러에서 에러를 발생시키고, 이 에러는 다음에 정의된 에러 처리 미들웨어로 전달됩니다. 에러 처리 미들웨어는 (err, req, res, next) 형태의 함수로 정의되어 있으며, err 매개변수에는 발생한 에러 객체가 전달됩니다.

에러 처리 미들웨어에서는 발생한 에러를 콘솔에 기록하고, 클라이언트에게 500 상태 코드와 에러 메시지를 반환하도록 설정되어 있습니다. 이로 인해 클라이언트가 에러 페이지를 받고, 에러 메시지가 화면에 나타납니다.

따라서, throw new Error 구문이 사용되었기 때문에 해당 에러가 발생하고 에러 처리 미들웨어로 전달되어 클라이언트에게 에러 메시지가 표시되는 것입니다.

 

 

728x90