λ―Έλ€μ¨μ΄ (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λ μ¬λ¬ νμΌμ λμμ μ
λ‘λν μ μλλ‘ μ§μνλ©°, μ΄λ₯Ό ν΅ν΄ λ€μ€ νμΌ μ
λ‘λλ₯Ό ꡬνν μ μμ΅λλ€.