미들웨어 : 웹서버의 모든 요청 / 응답에 대해 공통적인 관리를 가능하게 함.
다른 웹서버(Apche, Nginx)의 모듈이라는 개념과 유사함.
공식으로 제공하는 기본 미들웨어 : https://expressjs.com/ko/4x/api.html
미들웨어가 겹치는 경우 동작하는 방식
미들웨어에 next()가 실행되지 않으면 다음 미들웨어는 실행되지 않고 무한로딩에 걸린다. 미들웨어를 여러개 사용할 때는 순서를 유의해야한다.
express.js로 미들웨어를 만들어서 실행한 예제
const express = require('express');
const app = express();
const port = 3000;
const requestMiddleware = ((req, res, next) => { // 함수는 일급객체로 변수에 담아 사용할 수 있다. 함수표현식!
console.log("Request URL:",req.originalUrl, "-", new Date()); // 클라이언트가 접근한 URL과 날짜를 로그로 남김
next(); //next()를 실행하지 않으면 함수가 끝나지 않는다.
});
app.use(requestMiddleware); // 함수 실행
app.get('/', (req, res) => {
res.send('Hello World!@@@');
});
app.listen(port, () => {
console.log(port, '포트로 서버가 열렸어요!');
});
require()
는 exports 모듈을 가지고 온다.
module.exports
는 require()로 리턴한다.
routes
폴더를 생성해 goods.js
라는 파일을 생성합니다.// routes/goods.js
const express = require('express');
const router = express.Router();
// 엔드포인트를 작성하기.
router.get('/', (req, res) => { // /api 주소 접속시 response
res.send('this is home page');
});
router.get('/goods', (req, res) => { // /api/goods 주소 접속시 response
res.send('this is goods page');
});
// 리턴하는 exports 작성
module.exports = router; // app.js의 require()로 리턴. module.exports는 꼭 작성해야 함.
// app.js
const goodsRouter = require("./routes/goods");
app.use("/api", [goodsRouter]); // api주소가 요청되면 goodsRouter라는 이름의 라우터 모듈 실행
/api
로 시작되는 주소는 routes/goods.js
에 있는 Router 미들웨어를 통해 처리됩니다.