미들웨어는 req, res, next를 가진 함수입니다.
클라이언트에서 오는 요청 정보가 담긴 객체
서버가 응답해주는 응답 정보가 담긴 객체
next 함수를 호출하면 현재 미들웨어에 이어서 다음 미들웨어를 실행합니다.
기본 라우터 상태 app.js
var express = require('express')
var app = express()
// app에서 사용하는 미들웨어
// HTTP GET 요청에서 사용한다.
// 루트 '/' 경로에서 사용하는 미들웨어
// 하는 일 - 응답으로 'hi'라는 문자를 보낸다.
app.get('/', function (req, res) {
res.send('Hello World!')
})
app.listen(3000)
localhost:3000/ 에 접근하면 Hello World! 가 출력됩니다.
여기에 매번 리퀘스트를 받을 때마다, 콘솔창에 LOOOOGED라는 문자가 출력되는 미들웨어를 만들어봅니다.
// 나만의 미들웨어 만들기
const myLogger = (req,res,next)=>{
console.log('LOOOOOGED');
next();
}
// 미들웨어 사용하기
app.use(myLogger);
위 코드를 추가하고 다시 localhost:3000/ 에 접근하면 새로고침을 할 때마다, LOOOOOGED 문자가 서버 콘솔에 찍히는 걸 확인할 수 있습니다.
미들웨어에서 req 객체 프로퍼티를 추가해서 다음 미들웨어에 전달해 줄 수있습니다.
/ 나만의 미들웨어 만들기2 - req객체의 프로퍼티로 데이터 넘기기
const reqTime = (req,res,next)=>{
req.reqTime = Date.now();
next();
}
app.use(reqTime);
app.get('/',(req,res)=>{
let resText = 'Hello World!';
resText += req.reqTime; // req에 미들웨어에서 전달한 데이터가 들어있다.
res.send(resText);
})
app.listen(5500);
app.사용할 상황( 사용할 경로 , 미들웨어가 할 일);
// app에서 사용하는 미들웨어
// HTTP GET 요청에서 사용한다.
// 루트 '/' 경로에서 사용하는 미들웨어
// 하는 일 - 응답으로 'hi'라는 문자를 보낸다.
app.get('/',(req,res)=>{
res.send('hi');
})
파라미터 방식
app.use('/user/:id', (req,res,next)=>{
const id = req.params.id;
console.log(id);
next();
});
쿼리스트링 방식
app.use('/user', (req,res,next)=>{
const id = req.query.id;
console.log(id);
next();
});
만약 next('route')라고 사용한다면 다음 미들웨어가 아닌 다음 라우터로 바로 이동한다.
app.get('/user',(req,res,next)=>{
console.log('Requset URL:', req.originalUrl);
next('route'); // next안에 route를 쓰면 다음 라우터로 이동한다.
},(req,res,next)=>{ // 다음 미들웨어는 실행되지않는다.
// 로그와 응답을 보내지 않는다.
console.log('Requset Type', req.method);
res.send('hi');
});
// 다음 라우터 얘가 실행된다.
app.get('/user',(req,res)=>{
res.send('is OK?');
})
다른 미들웨어에서 next를 사용할 때, next(인수)로 'route'외에 다른 것을 넣는다면 에러처리 미들웨어로 이동하게 된다.
app.get('/user',(req,res,next)=>{
console.log('Requset URL:', req.originalUrl);
// next('route');
next(error); // 'route'를 제외한 인수를 던지면 에러처리 미들웨어로 바로 가버린다..
},(req,res,next)=>{ // 무시됨
console.log('Requset Type', req.method);
res.send('hi');
});
// 에러처리 미들웨어
app.use((err,req,res,next)=>{
console.error(err);
res.status(500).send('에러 처리 미들웨어에 도달했습니다..');
})
4.x버전부터 내장된 미들웨어들이다.
#node