6.1. 익스프레스 프로젝트 시작하기
nodemon package 설치하면 개발용으로 코드 수정하면 자동으로 재시작된다
6.2. 자주 사용하는 미들웨어
미들웨어가 실행되는 경우
- app.use(middleware)
- app.use(’/abc’, middleware)
- request starting with abc
- app.post(’/abc’, middleware)
- post request starting with abc
morgan
logger middleware
static
정적인 파일들을 제공하는 라우터 역할
body-parser
express에 이제 내장되어있지만 필요한 경우도 있음.
cookie-parser
요청의 쿠키를 해석해 req.cookies 객체로 만듦.
쿠키 비밀키를 통해 내 서버가 만든 쿠키임을 검증할 수 있음.
쿠키를 지우려면, 키와 값 외에 옵션도 정확히 일치해야 쿠키가 지워짐.
express-session
세션 관리용 미들웨어
미들웨어의 특성 활용하기
req, res, next를 매개변수로 갖는 함수
미들웨어 장착순서에 따라 어떤 미들웨어는 실행되지 않을 수 있음. → 순서가 중요
res.locals 객체에 값을 저장해 현재 요청이 처리되는 동안 데이터 공유 가능.
app.set은 전역에 저장.
미들웨어 안에 미들웨어를 넣을 수도 있음.
multer
설정 후 사용하면 업로드 처리 가능
const multer = require('multer'); const upload = multer({ storage: multer.diskStorage({ destination(req, file, done) { done(null, 'uploads/'); }, filename(req, file, done) { const ext = path.extname(); done(null, path.basename()); }, }), limits: { fileSize: 5 * 1024 * 1024 }, });
개수에 따라 single, array 사용
upload.single('image') uplaod.array('many')
Router 객체로 라우팅 분리하기
const express = require('express'); const router = express.Router(); router.get('/', (req, res) => { res.send('Hello, Express'); });
app.use로 라우터 넣어서 반영
app.use('/', indexRouter); app.use('/user', userRouter);
매개변수로 값 가져오는 것도 가능
router.get('/user/:id', (req, res) => { console.log(req.params); });
method만 다르면 하나에 chaining 으로 보기 좋게(?) 가능
router.route('/abc') .get((req, res) => { res.send('GET /abc'); }) .post((req, res) => { res.send('POST /abc'); });
req, res 객체 살펴보기
req, res 둘다 체이닝 가능
res .status(201) .cookie('test', 'test') .redirect('/admin');
템플릿 엔진 사용하기
Pug라는 것은 처음보고 신기한데 오히려 HTML 같지가 않아서 어색함..
Nunjucks 템플릿 엔진이 있는데 이게 흔히 파이썬에서도 많이쓰는 템플릿 형태와도 같음!
편—안
{% if fruit === 'apple' %} <p>apple</p> {% endif %}
include, extends를 통해 동일한 템플릿 코드 재활용 가능.
에러 처리 미들웨어
문제 생기면 서버에 오류가 뜨겠지만 개발하다보면 웹페이지에 에러로그가 뜬 화면을 많이 봤을것.
그 처리를 하기 위해서는 이 코드가 필요
// next로 넘겨받은 후 app.use((err, req, res, next) => { res.locals.message = err.message; res.locals.error = process.env.NODE_ENV !== 'production' ? err : {}; res.status(err.status || 500); res.render('error'); });