6. 익스프레스 웹 서버 만들기

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'); });