[C/F TIL] 37์ผ์ฐจ - Refactor Express, Middleware

mu-engยท2023๋…„ 6์›” 2์ผ
1

TIL (in boost camp)

๋ชฉ๋ก ๋ณด๊ธฐ
36/53
post-thumbnail

Code States
Front-end boost camp
Today
I
Learned

๐Ÿ€ 37์ผ์ฐจ!


๐Ÿ€ Express ์‹œ์ž‘ํ•˜๊ธฐ

  • Node.js๊ฐ€ ์ด๋ฏธ ์„ค์น˜ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •, ์–ดํ”Œ์„ ๋ณด๊ด€ํ•  ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ
npm init

์œ„ ๋ช…๋ น ํ™œ์šฉํ•ด package.json ํŒŒ์ผ ์ž‘์„ฑ -> enter ๋ˆ„๋ฅด๋ฉด ๊ธฐ๋ณธ๊ฐ’

npm instiall express

์œ„ ๋ช…๋ น ํ™œ์šฉํ•ด express ์„ค์น˜

๐Ÿ€ Middleware

  • ์ž๋™์ฐจ ๊ณต์žฅ์—์„œ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„์— ์˜ฌ๋ ค์ง„ ์ž๋™์ฐจ ๋ผˆ๋Œ€์— ๊ณต์ •๋งˆ๋‹ค ๋ถ€ํ’ˆ์„ ์ถ”๊ฐ€ํ•œ ๋’ค ์™„์„ฑ or ๋ถˆ๋Ÿ‰ํ’ˆ์ด ๊ฒฐ๊ณผ๋กœ ๋‚˜์˜ค๋Š” ๊ฒƒ๊ณผ ๋น„์Šท
  • ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ ์œ„ ์š”์ฒญ(Requesr)์— ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๋”ํ•˜๊ฑฐ๋‚˜, ๋ฌธ์ œ๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๋ถˆ๋Ÿ‰ํ’ˆ์„ ๋ฐ–์œผ๋กœ ๊ฑท์–ด๋‚ด๋Š” ์—ญํ• 

๐Ÿ€ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ƒํ™ฉ

โœ”๏ธ POST ์š”์ฒญ ๋“ฑ์— ํฌํ•จ๋œ body๋ฅผ ๊ตฌ์กฐํ™”ํ•  ๋•Œ

  • Node.js ๋กœ HTTP body(payload)๋ฅผ ๋ฐ›์„ ๋•Œ๋Š” Buffer๋ฅผ ์กฐํ•ฉํ•ด์„œ ๋‹ค์†Œ ๋ณต์žกํ•œ ๋ฐฉ์‹์œผ๋กœ body๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
  • ๋„คํŠธ์›Œํฌ ์ƒ chunk๋ฅผ ํ•ฉ์น˜๊ณ  Buffer๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ž‘์—…์ด ํ•„์š”
let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // body ๋ณ€์ˆ˜์—๋Š” ๋ฌธ์ž์—ด ํ˜•ํƒœ๋กœ payload๊ฐ€ ๋‹ด๊ฒจ์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
});

์œ„ ์ฝ”๋“œ๋ฅผ body-parser ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด?? โ–ผ

// npm์œผ๋กœ body-parser ์„ค์น˜
npm install body-parser
// body-parser๋ฅผ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();

// ์ƒ๋žต
app.post('/users', jsonParser, function (req, res) {

})
// Express ๋‚ด์žฅ ๋ฏธ๋“ค์›จ์–ด์ธ express.json() ์‚ฌ์šฉ
const jsonParser = express.json();

// ์ƒ๋žต
app.post('/api/users', jsonParser, function (req, res) {

})
// express.json() ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉ์— ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค๋ฉด?
const jsonParser = express.json({strict: false});

// ์ƒ๋žต
app.post('/api/users', jsonParser, function (req, res) {

})

โœ”๏ธ ๋ชจ๋“  ์š”์ฒญ/ ์‘๋‹ต์— CORS ํ—ค๋”๋ฅผ ๋ถ™์—ฌ์•ผ ํ•  ๋•Œ

  • Node.js HTTP ๋ชจ๋“ˆ์„ ์ด์šฉํ•œ ์ฝ”๋“œ์— CORS ํ—ค๋”๋ฅผ ๋ถ™์ด๋ ค๋ฉด, ์‘๋‹ต ๊ฐ์ฒด์˜ writeHead ๋ฉ”์„œ๋“œ๋ฅผ ์ด์šฉ
    -- ๋ผ์šฐํŒ…๋งˆ๋‹ค ํ—ค๋”๋ฅผ ๋งค๋ฒˆ ๋„ฃ์–ด์ค˜์•ผํ•จ
    -- OPTIONS ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๋ผ์šฐํŒ…๋„ ๋”ฐ๋กœ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ
const defaultCorsHeader = {
  'Access-Control-Allow-Origin': '*',
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  'Access-Control-Allow-Headers': 'Content-Type, Accept',
  'Access-Control-Max-Age': 10
};

// ์ƒ๋žต
if (req.method === 'OPTIONS') {
  res.writeHead(200, defaultCorsHeader);
  res.end()
}
  • cors ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด? โ–ผ
// npm์œผ๋กœ cors ์„ค์น˜
npm install cors
// ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด cors ํ—ˆ์šฉ
const cors = require('cors');

// ์ƒ๋žต
app.use(cors());
// ํŠน์ • ์š”์ฒญ์— ๋Œ€ํ•ด cors ํ—ˆ์šฉ
const cors = require('cors')

// ์ƒ๋žต
app.get('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})

โœ”๏ธ ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด url์ด๋‚˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ™•์ธํ•  ๋•Œ

  • ํ”„๋กœ์„ธ์Šค ์ค‘๊ฐ„์— ๊ด€์—ฌํ•˜์—ฌ ํŠน์ • ์—ญํ• ์„ ์ˆ˜ํ–‰
  • ๋ฏธ๋“ค์›จ์–ด๋Š” ๋‹ค์–‘ํ•จ
  • ์ผ๋ฐ˜์ ์ธ ๋ฏธ๋“ค์›จ์–ด์˜ ๊ตฌ์„ฑ โ–ผ

    -- endpoint๊ฐ€ / ์ด๋ฉด์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ GET ์š”์ฒญ์„ ๋ฐ›์•˜์„ ๋•Œ ์ ์šฉ๋˜๋Š” ๋ฏธ๋“ค์›จ์–ด, ์ˆœ์„œ์— ์œ ์˜
  • ๋งŒ์•ฝ, ํŠน์ • endpoint๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ชจ๋“  ์š”์ฒญ์— ๋™์ผํ•œ ๋ฏธ๋“ค์›จ์–ด๋ฅผ ์ ์šฉํ•˜๋ ค๋ฉด?
    -- ๋ฉ”์„œ๋“œ app.use ์‚ฌ์šฉ โ–ผ
const express = require('express')
const app = express();

const myLogger = function (req, res, next) {
	consloe.log('LOGGED');
    next();
};

app.use(myLogger);

app.get('/', function (req, res) {
	res.send('Hello World!');
});

app.listen(3000);
// ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ๋ฉ”์„œ๋“œ์™€ url์„ ์ถœ๋ ฅํ•˜๋Š” ์˜ˆ์‹œ?

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

const myLogger = function (req, res, next) {
  //req๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
  next();
};

app.use(myLogger);

app.get('/', function (req, res) {
  res.send('Hello World!');
});

app.listen(3000);

โœ”๏ธ ์š”์ฒญ ํ—ค๋”์— ์‚ฌ์šฉ์ž ์ธ์ฆ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ

  • HTTP ์š”์ฒญ์—์„œ ํ† ํฐ์ด ์žˆ๋Š”์ง€๋ฅผ ํŒ๋‹จํ•˜์—ฌ, ์ด๋ฏธ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์ผ ๊ฒฝ์šฐ ์„ฑ๊ณต, ์•„๋‹ ๊ฒฝ์šฐ ์—๋Ÿฌ๋ฅผ ๋ณด๋‚ด๋Š” ๋ฏธ๋“ค์›จ์–ด ์˜ˆ์ œ โ–ผ
app.use((req, res, next) => {
  // ํ† ํฐ์ด ์žˆ๋Š”์ง€ ํ™•์ธ, ์—†์œผ๋ฉด ๋ฐ›์•„์ค„ ์ˆ˜ ์—†์Œ.
  if(req.headers.token){
    req.isLoggedIn = true;
    next();
  } else {
    res.status(400).send('invalid user')
  }
})
profile
[๋ฌด์—ฅ์ผ๊ธฐ] ๋ฌด์—ฅ,,, ๋‚ด๊ฐ€ ๋จธ์จ์ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋  ์ˆ˜ ์ด์“ฐ๊นŒ,,,

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