Search

미듀웨어

미듀웨어 (middleware)

Express.js 의 μš”μ²­(request)κ³Ό 응닡(response) μ‚¬μ΄μ˜ μž‘μ—…μ„ μˆ˜ν–‰ν•˜λŠ” ν•¨μˆ˜
λ―Έλ“€μ›¨μ–΄λŠ” Express μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μš”μ²­-응닡 사이클 λ™μ•ˆ λ‹€μ–‘ν•œ μž‘μ—…μ„ μ²˜λ¦¬ν•  수 있으며, 각 λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­ 객체(req), 응닡 객체(res), 그리고 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μš”μ²­-응닡 μ£ΌκΈ°λ₯Ό μ œμ–΄ν•˜κΈ° μœ„ν•΄ ν˜ΈμΆœλ˜λŠ” λ‹€μŒ 미듀웨어 ν•¨μˆ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” next ν•¨μˆ˜λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

λ―Έλ“€μ›¨μ–΄μ˜ νŠΉμ§•

1.
순차적 μ‹€ν–‰: λ―Έλ“€μ›¨μ–΄λŠ” μ½”λ“œμ—μ„œ μ •μ˜λœ μˆœμ„œλŒ€λ‘œ 순차적으둜 μ‹€ν–‰λ©λ‹ˆλ‹€.
2.
μš”μ²­-응닡 μ£ΌκΈ° μ œμ–΄: 각 λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­κ³Ό 응닡 객체에 λŒ€ν•œ μ œμ–΄λ₯Ό 가지며, λ‹€μŒ λ―Έλ“€μ›¨μ–΄λ‘œ μ œμ–΄λ₯Ό μ „λ‹¬ν•˜κ±°λ‚˜ μš”μ²­-응닡 μ£ΌκΈ°λ₯Ό μ’…λ£Œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
3.
쀑간 처리 μž‘μ—…: λ―Έλ“€μ›¨μ–΄λŠ” μš”μ²­κ³Ό 응닡을 μ€‘κ°„μ—μ„œ κ°€λ‘œμ±„μ–΄ μˆ˜μ •ν•˜κ±°λ‚˜ μΆ”κ°€ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

자주 μ‚¬μš©λ˜λŠ” 미듀웨어

미듀웨어
μ„€λͺ…
morgan
HTTP μš”μ²­ λ‘œκΉ…μ„ μœ„ν•œ 미듀웨어
express.static
정적 νŒŒμΌμ„ μ œκ³΅ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 미듀웨어
body-parser
POST μš”μ²­μ˜ bodyλ₯Ό νŒŒμ‹±ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 미듀웨어
cookie-parser
μΏ ν‚€λ₯Ό νŒŒμ‹±ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 미듀웨어
express-session
μ„Έμ…˜ 관리λ₯Ό μœ„ν•œ 미듀웨어
multer
파일 μ—…λ‘œλ“œλ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 미듀웨어
λΌμš°νŒ… 미듀웨어
νŠΉμ • κ²½λ‘œμ— λŒ€ν•œ μš”μ²­μ„ μ²˜λ¦¬ν•˜λŠ” 데 μ‚¬μš©λ˜λŠ” 미듀웨어 app.get(), app.post()
Error Handling 미듀웨어
μ—λŸ¬ 처리λ₯Ό μœ„ν•œ 미듀웨어

미듀웨어 기본사항

β€’
기본 ꡬ쑰
app.use(미듀웨어)
app.use(β€™μ£Όμ†Œβ€™, 미듀웨어)
β€’
λ―Έλ“€μ›¨μ–΄λŠ” app.use() λ©”μ†Œλ“œμ™€ ν•¨κ»˜ μ‚¬μš©
β€’
첫 번째 인수인 β€˜μ£Όμ†Œβ€™λ₯Ό μ§€μ •ν•˜μ§€ μ•ŠμœΌλ©΄, λͺ¨λ“  μš”μ²­μ— λŒ€ν•˜μ—¬ 미듀웨어가 싀행됨
β€’
ν•˜λ‚˜μ˜ λΌμš°ν„°μ— μ—¬λŸ¬ 미듀웨어λ₯Ό μ—°κ²°ν•  수 있음

morgan

HTTP μš”μ²­ λ‘œκΉ…μ„ μœ„ν•œ 미듀웨어 - 개발 및 디버깅 μ‹œμ— μ‚¬μš©λ©λ‹ˆλ‹€.

μ„€μΉ˜

npm install morgan
Shell
볡사

μ˜ˆμ‹œ μ½”λ“œ

const morgan = require('morgan'); app.use(morgan('dev'));
JavaScript
볡사
const express = require('express'); const morgan = require('morgan'); const app = express(); const port = 3000; // 'dev' 포맷을 μ‚¬μš©ν•˜μ—¬ 둜그 생성 app.use(morgan('dev')); app.get('/', (req, res) => { res.send('Hello, World!'); }); app.listen(port, () => { console.log(`Server is running on port ${port}`); });
JavaScript
볡사
κΈ°μ‘΄ λ‘œκ·Έλ“€ 외에 좔가적인 λ‘œκ·Έλ“€μ„ λ³Ό 수 μžˆλ‹€.

둜그 μ˜ˆμ‹œ

GET / 200 7.189 ms - 13
Plain Text
볡사

body-parser

HTTP μš”μ²­μ˜ bodyλ₯Ό νŒŒμ‹±ν•˜κΈ° μœ„ν•œ 미듀웨어
주둜 POSTλ‚˜ PUT μš”μ²­κ³Ό 같이 ν΄λΌμ΄μ–ΈνŠΈκ°€ 데이터λ₯Ό μ„œλ²„λ‘œ 전솑할 λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€.
μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ— 데이터λ₯Ό μ „μ†‘ν•˜λ©΄, 이 λ°μ΄ν„°λŠ” HTTP μš”μ²­μ˜ body에 담겨 μ „μ†‘λ©λ‹ˆλ‹€. body-parserλŠ” μ΄λŸ¬ν•œ μš”μ²­μ˜ bodyλ₯Ό μ‰½κ²Œ ν•΄μ„ν•˜κ³  μ‚¬μš©ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€.

μ„€μΉ˜

npm install body-parser
Shell
볡사

μ˜ˆμ‹œμ½”λ“œ

const express = require('express'); const bodyParser = require('body-parser'); const app = express(); const port = 3000; // body-parserλ₯Ό μ‚¬μš©ν•˜μ—¬ JSON ν˜•μ‹μ˜ 데이터 νŒŒμ‹± app.use(bodyParser.json()); // body-parserλ₯Ό μ‚¬μš©ν•˜μ—¬ URL-encoded 데이터 νŒŒμ‹± app.use(bodyParser.urlencoded({ extended: false })); // POST μš”μ²­ 처리 app.post('/submit', (req, res) => { // req.bodyλ₯Ό 톡해 νŒŒμ‹±λœ 데이터에 μ ‘κ·Ό κ°€λŠ₯ const username = req.body.username; const password = req.body.password; // 처리 둜직 res.send(`Received data: ${username}, ${password}`); }); app.listen(port, () => { console.log(`Server is running on port ${port}`); });
JavaScript
볡사

μ‚¬μš© λͺ©μ 

1.
μš”μ²­ 데이터 νŒŒμ‹±: ν΄λΌμ΄μ–ΈνŠΈκ°€ 폼을 톡해 μ „μ†‘ν•œ λ°μ΄ν„°λ‚˜ JSON ν˜•μ‹μ˜ 데이터λ₯Ό Express μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ ν•΄λ‹Ή 데이터λ₯Ό νŒŒμ‹±ν•΄μ•Ό ν•©λ‹ˆλ‹€. body-parserλ₯Ό μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 데이터λ₯Ό μ‰½κ²Œ νŒŒμ‹±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
2.
데이터 ν˜•μ‹ 지원: body-parserλŠ” JSON 및 URL-encoded ν˜•μ‹μ˜ 데이터λ₯Ό μ§€μ›ν•˜λ©°, ν•„μš”μ— 따라 μ˜΅μ…˜μ„ μ‘°μ ˆν•˜μ—¬ λ‹€μ–‘ν•œ 데이터 ν˜•μ‹μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
3.
미듀웨어 ν˜•νƒœ: body-parserλŠ” Express.js λ―Έλ“€μ›¨μ–΄λ‘œ μ‚¬μš©λ˜λ―€λ‘œ, app.use()λ₯Ό 톡해 κ°„νŽΈν•˜κ²Œ μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
즉, body-parserλ₯Ό μ‚¬μš©ν•˜λ©΄ Express μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μ „μ†‘λœ 데이터λ₯Ό 효과적으둜 νŒŒμ‹±ν•˜μ—¬ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

cookie-parser

Express.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μΏ ν‚€λ₯Ό νŒŒμ‹±ν•˜κΈ° μœ„ν•œ 미듀웨어
cookie-parserλ₯Ό μ‚¬μš©ν•˜λ©΄ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ μ „μ†‘λœ μΏ ν‚€λ₯Ό μ‰½κ²Œ ν•΄μ„ν•˜κ³ , μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μΏ ν‚€λ₯Ό μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
μ›Ή λΈŒλΌμš°μ €λŠ” μΏ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ˜ μƒνƒœλ₯Ό μΆ”μ ν•˜κ³  정보λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. cookie-parserλŠ” Express.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° μ „μ†‘λœ μΏ ν‚€λ₯Ό νŒŒμ‹±ν•˜κ³ , μ„œλ²„μ—μ„œ ν΄λΌμ΄μ–ΈνŠΈλ‘œ μΏ ν‚€λ₯Ό μ„€μ •ν•˜κΈ° μœ„ν•œ λ„κ΅¬λ‘œ μ‚¬μš©λ©λ‹ˆλ‹€.

μ„€μΉ˜

npm install cookie-parser
JavaScript
볡사

μ˜ˆμ‹œ μ½”λ“œ

const express = require('express'); const cookieParser = require('cookie-parser'); const app = express(); const port = 3000; // cookie-parserλ₯Ό μ‚¬μš©ν•˜μ—¬ μΏ ν‚€ νŒŒμ‹± app.use(cookieParser()); // λΌμš°νŠΈμ—μ„œ μΏ ν‚€ μ„€μ • 및 읽기 app.get('/set-cookie', (req, res) => { // μΏ ν‚€ μ„€μ • res.cookie('username', 'john-doe', { maxAge: 900000, httpOnly: true }); // μΏ ν‚€ 읽기 const username = req.cookies.username; res.send(`Username from cookie: ${username}`); }); app.listen(port, () => { console.log(`Server is running on port ${port}`); });
JavaScript
볡사

μ‚¬μš© λͺ©μ 

1.
μƒνƒœ 좔적: μΏ ν‚€λŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ κ°„μ˜ μƒνƒœλ₯Ό μΆ”μ ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. μ‚¬μš©μžμ˜ 둜그인 μƒνƒœ, μ„Έμ…˜ 관리, μ‚¬μš©μž μ„ ν˜Έ μ„€μ • 등을 μ €μž₯ν•˜μ—¬ μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
2.
κ°œμΈν™”λœ κ²½ν—˜ 제곡: μΏ ν‚€λ₯Ό μ‚¬μš©ν•˜λ©΄ μ‚¬μš©μžμ—κ²Œ λ§žμΆ€ν˜• κ²½ν—˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‚¬μš©μžμ˜ μ„ ν˜Έ, ν…Œλ§ˆ, μ–Έμ–΄ 등을 μ €μž₯ν•˜μ—¬ λ‹€μŒ λ°©λ¬Έ μ‹œμ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
3.
인증 및 λ³΄μ•ˆ: μΏ ν‚€λŠ” μ‚¬μš©μžλ₯Ό μ‹λ³„ν•˜κ³  μΈμ¦ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ  수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ•”ν˜Έν™”λœ μΏ ν‚€λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³΄μ•ˆμ„ κ°•ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
cookie-parserλ₯Ό μ‚¬μš©ν•˜λ©΄ μ΄λŸ¬ν•œ 쿠킀와 κ΄€λ ¨λœ μž‘μ—…μ„ κ°„λ‹¨ν•˜κ²Œ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

express-session

Express.js μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ„Έμ…˜ 관리λ₯Ό μœ„ν•œ 미듀웨어
μ„Έμ…˜μ€ μ„œλ²„ 츑에 μ‚¬μš©μžμ˜ 정보λ₯Ό μ €μž₯ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈμ—λŠ” μ„Έμ…˜ μ‹λ³„μžλ₯Ό μ œκ³΅ν•˜μ—¬ μ‚¬μš©μž μƒνƒœλ₯Ό μœ μ§€ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€.
μ„Έμ…˜μ€ μ„œλ²„ 츑에 데이터λ₯Ό μ €μž₯ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ™€ μƒν˜Έμž‘μš©ν•˜λŠ” 데 μ‚¬μš©λ©λ‹ˆλ‹€. express-session은 Express μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ„Έμ…˜μ„ μ‰½κ²Œ κ΅¬ν˜„ν•˜κ³  관리할 수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. 이 λ―Έλ“€μ›¨μ–΄λŠ” 각 μ‚¬μš©μžμ—κ²Œ κ³ μœ ν•œ μ„Έμ…˜μ„ μ œκ³΅ν•˜κ³ , μ„Έμ…˜ 데이터λ₯Ό μ„œλ²„ 츑에 μ €μž₯ν•©λ‹ˆλ‹€.

μ„€μΉ˜

npm install express-session
Shell
볡사

μ˜ˆμ‹œ μ½”λ“œ

const express = require('express'); const session = require('express-session'); const app = express(); const port = 3000; // express-session을 μ‚¬μš©ν•˜μ—¬ μ„Έμ…˜ μ„€μ • app.use(session({ secret: 'your-secret-key', resave: false, saveUninitialized: true })); // μ„Έμ…˜ 등둝 app.get('/set-session', (req, res) => { req.session.username = 'john-doe'; res.send('Session is set'); }); // μ„Έμ…˜ 확인 app.get('/get-session', (req, res) => { const username = req.session.username; res.send(`Username from session: ${username}`); }); // μ„Έμ…˜ λͺ¨λ‘ 제거 (λ‘œκ·Έμ•„μ›ƒ) app.get('/logout', (req, res) => { req.session.destroy(); res.send('Logged out'); }); app.listen(port, () => { console.log(`Server is running on port ${port}`); });
JavaScript
볡사

μ„Έμ…˜ μ£Όμš” λ™μž‘

λ™μž‘
μ½”λ“œ
μ„€λͺ…
μ„Έμ…˜ 등둝
req.session[key] = value;
νŠΉμ • 킀에 λŒ€ν•œ μ„Έμ…˜ 데이터λ₯Ό λ“±λ‘ν•©λ‹ˆλ‹€.
μ„Έμ…˜ 확인
const value = req.session[key];
νŠΉμ • 킀에 λŒ€ν•œ μ„Έμ…˜ 데이터λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
μ„Έμ…˜ λͺ¨λ‘ 제거
req.session.destroy();
λͺ¨λ“  μ„Έμ…˜ 데이터λ₯Ό μ œκ±°ν•˜μ—¬ λ‘œκ·Έμ•„μ›ƒ 등에 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ‚¬μš© λͺ©μ 

1.
인증 및 μ‚¬μš©μž 식별: μ„Έμ…˜μ€ μ‚¬μš©μžλ₯Ό μ‹λ³„ν•˜κ³  μΈμ¦ν•˜κΈ° μœ„ν•΄ μ‚¬μš©λ©λ‹ˆλ‹€. λ‘œκ·ΈμΈν•œ μ‚¬μš©μžμ˜ 정보λ₯Ό μ„œλ²„μ— μ €μž₯ν•˜κ³  μ„Έμ…˜ μ‹λ³„μžλ₯Ό ν΄λΌμ΄μ–ΈνŠΈμ— μ œκ³΅ν•˜μ—¬ μ‚¬μš©μžλ₯Ό μ‹λ³„ν•©λ‹ˆλ‹€.
2.
μ„Έμ…˜ 데이터 μ €μž₯: μ„œλ²„ 츑에 μ‚¬μš©μžμ™€ κ΄€λ ¨λœ 데이터λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ 둜그인 μƒνƒœ, μ‚¬μš©μž μ„ ν˜Έ μ„€μ •, μž₯λ°”κ΅¬λ‹ˆ 등을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
3.
λ³΄μ•ˆ: μ„Έμ…˜μ€ 쿠킀에 μ €μž₯λ˜λŠ” 정보λ₯Ό μ„œλ²„ μΈ‘μ—μ„œ κ΄€λ¦¬ν•˜λ―€λ‘œ, λ³΄μ•ˆμƒμ˜ 이점이 μžˆμŠ΅λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈμ—μ„œλŠ” μ„Έμ…˜ μ‹λ³„μžλ§Œμ„ 가지고 μžˆμŠ΅λ‹ˆλ‹€.
express-session은 μ΄λŸ¬ν•œ μ„Έμ…˜ 관리와 κ΄€λ ¨λœ μž‘μ—…μ„ μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μœ μš©ν•œ λ―Έλ“€μ›¨μ–΄μž…λ‹ˆλ‹€.

multer

Node.js μ„œλ²„μ—μ„œ 파일 μ—…λ‘œλ“œλ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•œ 미듀웨어
ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ μ„œλ²„λ‘œ νŒŒμΌμ„ μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜κ³  μ„œλ²„μ—μ„œ 이λ₯Ό λ°›μ•„ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 주둜 HTML 폼을 톡해 이미지, λ™μ˜μƒ, λ¬Έμ„œ λ“± λ‹€μ–‘ν•œ νŒŒμΌμ„ μ—…λ‘œλ“œν•  λ•Œ μœ μš©ν•©λ‹ˆλ‹€.
MulterλŠ” multipart/form-data ν˜•μ‹μ˜ 폼 데이터λ₯Ό μ²˜λ¦¬ν•˜λ©°, 이λ₯Ό 톡해 파일 μ—…λ‘œλ“œλ₯Ό κ°€λŠ₯μΌ€ ν•©λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ νŒŒμΌμ„ μ„œλ²„λ‘œ μ „μ†‘ν•˜λ©΄ Multerκ°€ 이λ₯Ό λ°›μ•„ μ €μž₯ν•˜κ³ , μ„œλ²„μ—μ„œλŠ” μ—…λ‘œλ“œλœ νŒŒμΌμ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

μ„€μΉ˜

npm install multer
Shell
볡사

μ˜ˆμ‹œ μ½”λ“œ

β€’
./routes/upload.js
β€’
./views/upload.ejs
β€’
app.js
β€’
./uploads 폴더 생성

ν”„λ‘œμ νŠΈ 생성

npm install -g express-generator
Shell
볡사
express --view=ejs upload
Shell
볡사
λ„Œμ μŠ€ ν…œν”Œλ¦Ώ 엔진 μ‚¬μš©

ν”„λ‘œμ νŠΈ 경둜둜 이동

cd upload
HTML
볡사

μ˜μ‘΄μ„± μ„€μΉ˜

npm install
HTML
볡사

μ„œλ²„ μ‹€ν–‰

npm start
HTML
볡사

./routes/upload.js

const express = require('express'); const router = express.Router(); const multer = require('multer'); const path = require('path'); // 파일 μ—…λ‘œλ“œλ₯Ό μœ„ν•œ Multer μ„€μ • const storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, 'uploads/'); // μ—…λ‘œλ“œλœ 파일의 μ €μž₯ 경둜 }, filename: function (req, file, cb) { cb(null, file.originalname); // μ—…λ‘œλ“œλœ 파일의 μ›λž˜ 파일λͺ…μœΌλ‘œ μ €μž₯ } }); const upload = multer({ storage: storage }); /* GET upload page. */ router.get('/', function(req, res, next) { res.render('upload', { title: 'upload' }); }); // 파일 μ—…λ‘œλ“œλ₯Ό μ²˜λ¦¬ν•˜λŠ” 라우트 router.post('/', upload.single('image'), (req, res) => { console.log(req.file); res.send('ok'); }); module.exports = router;
JavaScript
볡사

./views/upload.ejs

<!DOCTYPE html> <html> <head> <title><%= title %></title> <link rel='stylesheet' href='/stylesheets/style.css' /> </head> <body> <form action="/upload" method="post" enctype="multipart/form-data"> <input type="file" name="image" /> <button type="submit">Upload</button> </form> </body> </html>
HTML
볡사

app.js

var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var uploadRouter = require('./routes/upload'); // βœ… upload λΌμš°ν„° μΆ”κ°€ var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/upload', uploadRouter); // βœ… upload λΌμš°ν„° μΆ”κ°€ // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;
JavaScript
볡사

./uploads 폴더 생성

μ‚¬μš© λͺ©μ 

1.
파일 μ—…λ‘œλ“œ 처리: MulterλŠ” 파일 μ—…λ‘œλ“œλ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ„λ‘ λ„μ™€μ€λ‹ˆλ‹€. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„λ‘œ νŒŒμΌμ„ μ•ˆμ „ν•˜κ²Œ μ „μ†‘ν•˜λ©΄, MulterλŠ” 이λ₯Ό λ°›μ•„ μ €μž₯ν•˜κ³  κ΄€λ ¨λœ 정보λ₯Ό μ„œλ²„μ— μ œκ³΅ν•©λ‹ˆλ‹€.
2.
파일 μ—…λ‘œλ“œ μ„€μ •: Multerλ₯Ό μ‚¬μš©ν•˜λ©΄ μ—…λ‘œλ“œλœ 파일의 μ €μž₯ 경둜, 파일λͺ… 등을 μ‚¬μš©μžκ°€ μ›ν•˜λŠ” λŒ€λ‘œ μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
3.
폼 데이터 닀루기: MulterλŠ” multipart/form-data ν˜•μ‹μ˜ 폼 데이터λ₯Ό λ‹€λ£° 수 μžˆμ–΄, 이미지, λ™μ˜μƒ, λ¬Έμ„œ λ“± λ‹€μ–‘ν•œ 파일 ν˜•μ‹μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
4.
닀쀑 파일 μ—…λ‘œλ“œ: MulterλŠ” μ—¬λŸ¬ νŒŒμΌμ„ λ™μ‹œμ— μ—…λ‘œλ“œν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λ©°, 이λ₯Ό 톡해 닀쀑 파일 μ—…λ‘œλ“œλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.