미들웨어는 express
의 핵심이다. 요청과 응답의 중간에 위치하기 때문에 미들웨어라고 부르는 것이다.
Router
와 Error handler
또한 미들웨어의 일종이므로 미들에어가 익스프레스의 전부라고 해도 과언이 아니다.
미들웨어는 요청과 응답을 조작해 기능을 추가하기도 하고, 나쁜 요청을 걸러내기도 한다.
익스프레스 내에서 웹 요청과 응답에 대한 정보를 사용해서 필요한 처리를 진행할 수 있도록 분리된 독립적인 함수이다.
요청과 응답의 중간에 위치하여 미들웨어
미들웨어는 req, res, next가 매개변수인 함수
미들웨어 함수를 여러번 인자로 쓸 수 있음
req: 요청
,res: 응답 조작 가능
,next()로 다음 미들웨어로 넘어감.
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요청에서 미들웨어 실행 |
...
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
로 네 개다
모든 매개변수를 사용하지 않더라도 반드시 네 개여야 한다.
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.send
나 res.sendFile
등의 메서드로 응답을 보내야한다.
출처
https://inpa.tistory.com/entry/EXPRESS-📚-미들웨어-💯-이해-정리 [Inpa Dev 👨💻:티스토리]
https://www.zerocho.com/ Node.js 교과서 -조현영 지음