[Node.js] express (2) - Middleware ๋ฏธ๋“ค์›จ์–ด ๐Ÿ’ฏ๏ธ

jungeundelilahLEEยท2020๋…„ 12์›” 31์ผ
0

Node.js

๋ชฉ๋ก ๋ณด๊ธฐ
16/27

goal

๋ฏธ๋“ค์›จ์–ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ ๐Ÿ‘‰๏ธ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฐธ๊ณ 

๋ฏธ๋“ค์›จ์–ด ๐Ÿ’ฏ๏ธ

  • ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋งŒ๋“ (= third party middleware) or ๋‚ด๊ฐ€ ๋งŒ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ณต์œ ํ•ด์„œ ์“ฐ๋Š” ๊ฐœ๋…

  • express ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋ณธ์งˆ์ ์œผ๋กœ (์—ฌ๋Ÿฌ๊ฐœ์˜?) ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด๋‹ค.

  • ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜ ์‚ฌ์šฉ์€
    npm install <๋ฏธ๋“ค์›จ์–ด name> --save๋ฅผ ํ•˜๋ฉด ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋Š”

    1. ์š”์ฒญ์˜ค๋ธŒ์ ํŠธ(req)
    2. ์‘๋‹ต์˜ค๋ธŒ์ ํŠธ(res)
    3. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”์ฒญ-์‘๋‹ต cycle์—์„œ ๊ทธ ๋‹ค์Œ์˜ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๊ฐ–๋Š” ํ•จ์ˆ˜์ด๋‹ค. (usually ๋ณ€์ˆ˜๋ช…์€ next๋กœ ํ‘œ๊ธฐํ•œ๋‹ค.)

๋ฏธ๋“ค์›จ์–ด๊ฐ€ ํ•˜๋Š” ์ผ (task)

  1. ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ์‹คํ–‰
  2. ์š”์ฒญ/์‘๋‹ต ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์„ ์‹คํ–‰
  3. ์š”์ฒญ/์‘๋‹ต ์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒ
  4. ์Šคํƒ ๋‚ด์˜ ๊ทธ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ดํ•จ์ˆ˜(next)๋ฅผ ํ˜ธ์ถœ
    • (ํ˜„์žฌ์˜ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ์š”์ฒญ-์‘๋‹ต ์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋Š” next()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์— ์ œ์–ด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ•ด๋‹น ์š”์ฒญ์€ ์ •์ง€๋œ ์ฑ„๋กœ ๋ฐฉ์น˜๋œ๋‹ค.)

๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฏธ๋“ค์›จ์–ด

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ โžก๏ธ ์„ ํƒ์ ์ธ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ
  2. ๋ผ์šฐํ„ฐ ๋ ˆ๋ฒจ โžก๏ธ ์„ ํƒ์ ์ธ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ
  3. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
  4. ๊ธฐ๋ณธ ์ œ๊ณต
  5. third party โžก๏ธ third party ๋ฏธ๋“ค์›จ์–ด๋Š” ์—ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ  (๋งค์šฐ ์œ ์šฉ)
  • ๋ฏธ๋“ค์›จ์–ด์˜ ๋กœ๋“œ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜๋ฉฐ, ๋จผ์ € ๋กœ๋“œ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.

๋ฏธ๋“ค์›จ์–ด ์ž‘์„ฑ๊ณผ ์˜ˆ

// index.js

var express = require('express');
var app = express();

var myLogger = function (req, res, next) {
  console.log('LOGGED');
  next();
};
// ๐Ÿ‘‡๏ธ
// myLogger๋Š” ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜
// -> ์•ฑ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ๊ฑฐ์ณ ์ „๋‹ฌ๋  ๋•Œ ๋‹จ์ˆœํžˆ โ€œLOGGEDโ€๋ฅผ ์ธ์‡„ (in terminal)

app.use(myLogger);
// ๐Ÿ‘‡๏ธ
// ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ๋กœ๋“œํ•˜๋ ค๋ฉด (๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๋ฅผ ์ง€์ •ํ•˜์—ฌ) โญ๏ธapp.use()๋ฅผ ํ˜ธ์ถœโญ๏ธํ•ด์•ผ ํ•œ๋‹ค.
// ์•ฑ์ด ์š”์ฒญ์„ ์ˆ˜์‹ ํ•  ๋•Œ๋งˆ๋‹ค, ์•ฑ์€ โ€œLOGGEDโ€๋ผ๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ„ฐ๋ฏธ๋„์— ์ธ์‡„ํ•œ๋‹ค.
// โญ๏ธ๋ฏธ๋“ค์›จ์–ด์˜ ๋กœ๋“œ ์ˆœ์„œ๋Š” ์ค‘์š”ํ•˜๋ฉฐ, ๋จผ์ € ๋กœ๋“œ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜๊ฐ€ ๋จผ์ € ์‹คํ–‰๋œ๋‹ค.โญ๏ธ
// ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜ myLogger๋Š” ๋‹จ์ˆœํžˆ ๋ฉ”์‹œ์ง€๋ฅผ ์ธ์‡„ํ•œ ํ›„ โญ๏ธnext() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœโญ๏ธํ•˜์—ฌ ์Šคํƒ ๋‚ด์˜ ๊ทธ ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด ํ•จ์ˆ˜์— ์š”์ฒญ์„ ์ „๋‹ฌํ•œ๋‹ค.

app.get('/', function (req, res) {
  res.send('Hello 222World!');
});
// if) app.use(myLogger); -> ์—ฌ๊ธฐ์— ์œ„์น˜ํ•œ๋‹ค๋ฉด, 
// ๐Ÿ‘‡๏ธ
// ๋ฃจํŠธ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ๋ผ์šฐํŒ… ์ดํ›„์— myLogger๊ฐ€ ๋กœ๋“œ๋˜๋ฉด, ๋ฃจํŠธ ๊ฒฝ๋กœ์˜ ๋ผ์šฐํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์š”์ฒญ-์‘๋‹ต ์ฃผ๊ธฐ๋ฅผ ์ข…๋ฃŒํ•˜๋ฏ€๋กœ ์š”์ฒญ์€ ์ ˆ๋Œ€๋กœ myLogger์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ•˜๋ฉฐ ์•ฑ์€ โ€œLOGGEDโ€๋ฅผ ์ธ์‡„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

app.listen(3000);


๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฏธ๋“ค์›จ์–ด

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ โžก๏ธ ์„ ํƒ์ ์ธ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ
  2. ๋ผ์šฐํ„ฐ ๋ ˆ๋ฒจ โžก๏ธ ์„ ํƒ์ ์ธ ๋งˆ์šดํŠธ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ๋กœ๋“œ
  3. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ
  4. ๊ธฐ๋ณธ ์ œ๊ณต
  5. third party
  • 1๋ฒˆ๊ณผ 5๋ฒˆ ๋จผ์ € ์•Œ์•„๋ณด์ž

1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ

// ๐Ÿ’•๏ธ body-parser ๋ฏธ๋“ค์›จ์–ด

app.use(bodyParser.urlencoded({ extended: false }))
// ๐Ÿ‘‡๏ธ
// bodyParser.urlencoded({ extended: false })
// ์ด ์ฝ”๋“œ๋Š” ์‹คํ–‰๋˜๋ฉด์„œ, ๊ฒฐ๊ณผ๋กœ ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋“ค์–ด์˜ค๊ฒŒ ๋œ๋‹ค.
// ๋ฐ”๋””ํŒŒ์„œ๊ฐ€ ๋งŒ๋“œ๋Š” ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ํ‘œํ˜„์‹
// main.js๊ฐ€ ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์œ„์˜ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋œ๋‹ค.
// ๋‚ด๋ถ€์ ์œผ๋กœ๋Š”, ์‚ฌ์šฉ์ž๊ฐ€ ์ „์†กํ•œ body๋ถ€๋ถ„์„ ๋ฐ”๊ฟ”์ค€๋‹ค.
  // let body = '';
  // req.on('data', (data) => body += data)

// ๐Ÿ’•๏ธ compression ํŒŒ์ผ์˜ ํฌ๊ธฐ๋ฅผ ์••์ถ•ํ•ด์ฃผ๋Š” ๋ฏธ๋“ค์›จ์–ด
app.use(compression())

-------------------------------------------------------

// ๐Ÿ’•๏ธ ๋‚˜๋งŒ์˜ ๋ฏธ๋“ค์›จ์–ด ๋งŒ๋“ค๊ธฐ ๐Ÿ’•๏ธ

app.use((req, res, next) => { //next์— , req/res ๋‹ค์Œ์— ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.
  fs.readdir("./data", (error, filelist) => {
    req.list = filelist
    next() // req/res ๋’ค์— next๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  })
})

// ๐Ÿ‘‡๏ธ ๋งŒ๋“ค์—ˆ๋˜ ๋ฏธ๋“ค์›จ์–ด๋ฅผ (*)๋ชจ๋“  get์š”์ฒญ์ผ ๋•Œ๋กœ ๋ผ์šฐํŒ… 
app.get("*", (req, res, next) => { //next์— , req/res ๋‹ค์Œ์— ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•  ๋ฏธ๋“ค์›จ์–ด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋‹ค.
  fs.readdir("./data", (error, filelist) => {
    req.list = filelist
    next() // req/res ๋’ค์— next๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
  })
})

--------------------------------------------------------

// ๐Ÿ’•๏ธ ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉ๋ฒ•

app.use('/user/:id', function(req, res, next) {
  console.log('Request URL:', req.originalUrl);
  next(); // next๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์€ ๐Ÿ‘‡๏ธ ์•„๋ž˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๊ฐ™์Œ
}, function (req, res, next) {
  console.log('Request Type:', req.method);
  next();
});

//! but! 

app.get('/user/:id', function (req, res, next) {
  console.log('ID:', req.params.id);
  next();
}, function (req, res, next) {
  res.send('User Info'); // ์ด๋ ‡๊ฒŒ sendํ•ด๋ฒ„๋ฆฌ๋ฉด ๋‹ค์Œ ๋ฏธ๋“ค์›จ์–ด๐Ÿ‘‡๏ธ๋Š” ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
});

app.get('/user/:id', function (req, res, next) {
  res.end(req.params.id);
});

//! or~

app.get('/user/:id', function (req, res, next) {
  if (req.params.id == 0) next('route'); // ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฏธ๋“ค์›จ์–ด๋ฅผ if๋ฌธ์œผ๋กœ ๋‹ค์‹œ ์‹คํ–‰์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  else next(); //
}, function (req, res, next) {
  res.render('regular');
});

app.get('/user/:id', function (req, res, next) {
  res.render('special');
});

์ถœ์ฒ˜ : ์ƒํ™œ์ฝ”๋”ฉ https://www.youtube.com/watch?v=LX4MHFRiMhk&list=PLuHgQVnccGMAGOQu8CBDO9hn-FXFmm4Wp&index=15 / express ๊ณต์‹๋ฌธ์„œ https://expressjs.com/ko/guide/using-middleware.html

profile
delilah's journey

0๊ฐœ์˜ ๋Œ“๊ธ€