미들웨어란?
요청(req)과 응답(res)의 중간(미들)에 위치하여 특정 기능을 수행한다.
라우터와 에러 핸들러 또한 미들웨어의 일종이다.
미들웨어는 요청과 응답을 조작해 기능을 추가하기도 하며 나쁜 요청을 걸러내기도 한다.
app.use( 미들웨어 )
미들웨어는 app.use와 함께 사용한다.
// 미들웨어 사용해보기
app.use((req, res, next) => {
console.log('모든 요청에서 실행된다.');
next(); // next를 해야 다음 일을 하기위해 넘어간다.
});
localhost:3000를 호출하면 미들웨어도 실행된다.
반드시, next( )를 미들웨어 마지막에 써줘야한다. next를 실행하지 않으면 다음으로 넘어갈 수 없다.
app.use( [, 경로 ] ,미들웨어 )
app.use([, 경로 ] ,미들웨어 )로 특정 경로 요청에서만 미들웨어가 실행되게 할 수 있다.
미들웨어를 여러 개 장착할 수도 있다.
app.get(
'/',
(req, res, next) => {
// 미들웨어를 여러개 넣을 수 있다.
console.log('GET 요청에서만 실행되는 미들웨어');
next(); // next를 꼭 써줘야한다.
},
(req, res) => {
throw new Error('에러는 에러 처리 미들웨어로..'); // err.message
}
);
app.get( 경로 , 미들웨어 , 콜백 함수 )
app.use뿐만 아니라 app.get이나 app.post의 중간에 미들웨어를 넣어 사용할 수도 있다.
에러처리 미들웨어
에러처리 미들웨어는 매개변수 (err, req, res, next) 로 총 네 개를 가지고 있다. 반드시 네 개여야한다.
err는 에러에 관한 정보가 담겨있다.
// 에러 처리 미들웨어
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send(err.message);
});
res.status( HTTP 상태 코드)로 직접 상태코드를 지정할 수 있다.
🎶 여러 미들웨어 패키지
다운받은 패키지들은 app.use( 패키지 )로 사용할 수 있다.
매개변수인 (req,res,next)가 없는 이유는 미들웨어 내부에 이미 들어있기 때문이다.
morgan
요청과 응답에 대한 정보를 콘솔에 기록한다. 콘솔은 노드쪽 콘솔이다.
사용방법
app.use(morgan( '인수' ));
app.use(morgan( 'dev' ));
인수에 따라 다른 로그 정보를 콘솔에 기록한다.
dev인수는 개발 환경에서 사용하고, 배포 환경에서는 combined를 사용한다.
static
정적인 파일들을 제공하는 라우터 역할을 한다. 노드 기본 제공이기 때문에 설치할 필요가 없다.
사용방법
// 정적인 파일들을 제공하는 라우터 역할
// localhost:3000/test.js
app.use(express.static('public'));
// localhost:3000/test/test.js
app.use('/static', express.static('public'));
express.static('실제 정적파일이 있는 경로')
express.static('경로 안에 폴더' ,'실제 정적파일이 있는 경로')
body-parser
요청(req) 본문에 있는 데이터를 해석해서 req.body 객체로 만들어주는 미들웨어
멀티파트(이미지, 동영상, 파일) 데이터는 처리할 수없다.
사용방법
노드 4.16.0 버전부터 익스프레스에 내장되어서 따로 설치할 필요가없다.
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
그러나, 내장 모듈은 JSON과 URL-encoded 형식의 데이터만 해석 할 수 있다.
Raw(요청 본문이 버퍼데이터)와 Text(텍스트 데이터)를 해석하고 싶으면 바디 파서를 따로 설치해야한다.
// 설치
// npm i body-parser
const bodyParser = require('body-parser');
app.use(bodyParser.raw());
app.use(bodyParser.text());
요청 데이터 종류
- JSON - JSON 형식의 데이터 전달 방식
- URL- encoded - 주소 형식으로 데이터를 보내는 방식. { extended :false }면 노드의 querystring모듈을 사용해 쿼리스트링을 해석하고, { extened: true }면 외부 모듈인 qs 모듈을 사용해 쿼리스트링을 해석한다. qs 모듈은 설치해야한다.
- Raw - 버퍼 데이터
- Text - 텍스트 데이터
cookie-parser
요청(req)에 동봉된 쿠키를 해석해서 req.cookies 객체로 만든다.
사용방법
// cookie-parser 쿠키를 해석해서 객체로 만든다
app.use(cookieParser(비밀키));
app.use(cookieParser(process.env.COOKIE_SECRET));
해석된 쿠키들은 req.cookies 객체에 들어간다.
비밀키를 통해 해당 쿠키가 서버에서 만든 쿠키임을 검증 할 수있다. 비밀키를 이용해 서명을 만들어 쿠키 값 뒤에 붙인다. 서명된 쿠키는 req.cookies 객체가 아닌 req.signedCookies객체에 들어있다.
express-session
세션 관리용 미들웨어이다. 세션은 사용자별로 req.session객체 안에서 유지된다.
사용하기
app.use(
session({
resave: false,
saveUninitialized: false,
secret: process.env.COOKIE_SECRET,
cookie: {
httpOnly: true,
secure: false,
},
name: 'session-cookie',
})
);
내부적으로 cookie-parser를 사용하고 있다. 인수로 세션에 대한 설정을 받는다.
인수들
- resave - 요청이 올 때, 세션에 수정사항이 없더라도 세션을 다시 저장할지 설정
- saveUninitialized - 세션에 저장할 내역이 없더라도 처음부터 세션을 생서알지 설정
- secret - 쿠키를 서명하는데 필요한 키
- cookie - 세션 쿠키에 대한 설정
Node.js 교과서
'공부 > 노드' 카테고리의 다른 글
jwt - req.headers.authorization이 undefined인 에러 (0) | 2021.06.28 |
---|---|
express - req와 res 객체 (1) | 2021.06.24 |
express - 라우터 (0) | 2021.06.24 |
express- multer (0) | 2021.06.24 |
express 시작하기 (1) | 2021.06.23 |
댓글