메소드와 URL(/lower, /upper 등)로 분기점을 만드는 것을 라우팅(Routing)이라고 한다.
아래와 같이 경로를 묶어 처리해 줄 수 있다.
import express from 'express';
const app = express();
app.use(express.json());
app
.route('/posts')
.get((req, res, next) => {
res.status(201).send('GET');
})
.post((req, res, next) => {
res.status(201).send('POST');
});
app.listen(8080);
하지만, 경로가 더 복잡해지면 이것 또한 가독성, 모듈성, 유지보수성이 떨어진다.
때문에, 아래와 같이 router를 통해 모듈화 시킨다.
app.js
import express from 'express'; import postRouter from './router/post.js'; import userRouter from './router/user.js'; const app = express(); app.use(express.json()); app.use('/posts', postRouter); app.use('/user', userRouter); app.use((error, req, res, next) => { console.log(error); res.status(500).send('sorry, try later!'); }); app.listen(8080);
user.js
import express from 'express'; const router = express.Router(); router.get('/', (req, res) => { res.status(201).send('GETGET / user'); }); router.post('/', (req, res) => { res.status(201).send('POSTPOST / user'); }); export default router;
post.js
import express from 'express'; const router = express.Router(); router.get('/', (req, res) => { res.status(201).send('GETGET / post'); }); export default router;
REST API에서 Body를 파싱할 때 사용
미들웨어 없이req.body 에 접근하는 경우에는 기본으로undefined 가 설정되어 있다.
때문에, express에서 body의 내용을 읽기 위해서는 expresss.json() 혹은 body.parser을 이용해야 한다.
app.use(express.json());
// app.use(express.json({strict:false}));
app.post('/', (req,res,next) => {
console.log(req.body)
}
express.json 미들웨어는 요청이 들어오는 body부분을 자동으로 parsing하여 보여준다.
HTML From UI요소에서 submit를 하면 request가 자동으로 발생하게 되고 그때 전달된 HTML에서 만든 데이터를 Body 안으로 파싱해준다.
옵션을 꼭 전달해 주어야한다.
app.use(express.urlencoded({extended: faslse}))
자동으로 public안의 파일들을 사용자가 읽어갈 수 있도록 한다.
app.use(express.static('public'))
express.static('public')이 없는 경우
public안의 example.img를 응답해주기 위해서는
app.get('/public/exampl.img', (req,res) =>{...}) 등과 같은 처리를 해주어야 하지만,
위의 express.static('public')만 설정해주면, 따로 처리하지 않아도 public안의 모든 리소스를 사용자가 읽어갈 수 있도록 허용할 수 있다.
다양한 옵션을 설정해 줄 수 있다.
var options = {
dotfiles: 'ignore',
etag: false,
extensions: ['htm', 'html'],
index: false,
maxAge: '1d',
redirect: false,
setHeaders: function (res, path, stat) {
res.set('x-timestamp', Date.now())
}
}
app.use(express.static('public', options))
request안의 cookie를 보려면 cookie-parser를 사용해야 한다.
npm i cookie-parser
import cookieParser from 'cookie-parser'
app.use(cookieParser())
로깅(logging)에 도움을 주는 미들웨어
client에서 요청한 메소드나 상태코드 등을 남긴다.
npm i morgan
import morgan from 'morgan'
app.use(morgan('combined'))
// app.use(morgan('tiny'))
보안에 필요한 공통적인 헤더를 추가해준다.
npm i helmet
import helmet from 'helmet'
app.use(helmet())