Jieunny์ ๋ธ๋ก๊ทธ
S2) Unit 10. [Web Server] Refactor Express ๋ณธ๋ฌธ
๐ฃ Express
โ๏ธ Node.js ํ๊ฒฝ์์ ์น ์๋ฒ, ๋๋ API ์๋ฒ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ
โ๏ธ Node.js HTTP ๋ชจ๋๋ก ์์ฑํ ์๋ฒ์ ๋ค๋ฅธ ์
โฐ ๋ฏธ๋ค์จ์ด๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
โฐ ๋ผ์ฐํฐ๋ฅผ ์ ๊ณตํ๋ค.
1๏ธโฃ Express ์ค์น
npm install express
2๏ธโฃ ๊ฐ๋จํ ์น ์๋ฒ ๋ง๋ค๊ธฐ
const express = require('express')
const app = express()
const port = 3000
app.get('/', (req, res) => {
res.send('Hello World!')
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
โฐ ์๋ต์ผ๋ก Hello World!๋ฅผ ๋ณด๋ด๋ Express ์๋ฒ
3๏ธโฃ ๋ผ์ฐํ : ํน์ ๋ฉ์๋์ URI๋ก ๋ถ๊ธฐ์ ์ ๋ง๋๋ ๊ฒ
โฐ ํด๋ผ์ด์ธํธ๋ ํน์ ํ HTTP ์์ฒญ ๋ฉ์๋(GET, POST ๋ฑ)๊ณผ ํจ๊ป ์๋ฒ์ ํน์ URI๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค.
โฐ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ํด๋นํ๋ Endpoint์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ
//Node.js
const requestHandler = (req, res) => {
if(req.url === '/lower') {
if (req.method === 'GET') {
res.end(data)
} else if (req.method === 'POST') {
req.on('data', (req, res) => {
// do something ...
})
}
}
}
//Express : ์์ฒด์ ์ผ๋ก ๋ผ์ฐํฐ ๊ธฐ๋ฅ ์ ๊ณต
const router = express.Router()
router.get('/lower', (req, res) => {
res.send(data);
})
router.post('/lower', (req, res) => {
// do something
})
๐ฃ ๋ฏธ๋ค์จ์ด
โ๏ธ express์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ผ๋ก, ์์ฒญ์ ํ์ํ ๊ธฐ๋ฅ์ ๋ํ๊ฑฐ๋, ๋ฌธ์ ๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒ์ ๋ฐ์ผ๋ก ๊ฑท์ด๋ด๋ ์ญํ
โฐ POST ์์ฒญ ๋ฑ์ ํฌํจ๋ body(payload)๋ฅผ ๊ตฌ์กฐํํ ๋(์ฝ๊ฒ ์ป์ด๋ด๊ณ ์ ํ ๋)
โฐ ๋ชจ๋ ์์ฒญ/์๋ต์ CORS ํค๋๋ฅผ ๋ถ์ฌ์ผ ํ ๋
โฐ ๋ชจ๋ ์์ฒญ์ ๋ํด url์ด๋ ๋ฉ์๋๋ฅผ ํ์ธํ ๋
โฐ ์์ฒญ ํค๋์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋์ง ํ์ธํ ๋
1๏ธโฃ POST ์์ฒญ ๋ฑ์ ํฌํจ๋ body(payload)๋ฅผ ๊ตฌ์กฐํํ ๋
โฐ Node.js๋ก HTTP ์์ฒญ body๋ฅผ ๋ฐ๋ ์ฝ๋
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// body ๋ณ์์๋ ๋ฌธ์์ด ํํ๋ก payload๊ฐ ๋ด๊ฒจ์ ธ ์์ต๋๋ค.
});
โฐ body-parser ๋ฏธ๋ค์จ์ด ์ฌ์ฉ
npm install 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({strict: false});
// ์๋ต
app.post('/api/users', jsonParser, function (req, res) {
})
โฐ strict:false ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ Object ํํ๊ฐ ์๋ ๋ฐ์ดํฐ๋ ๋ฐ์ ์ ์๋ค.
2๏ธโฃ ๋ชจ๋ ์์ฒญ/์๋ต์ CORS ํค๋๋ฅผ ๋ถ์ผ ๋
โฐ Node.js์ CORS๋ฅผ ์ ์ฉํ๋ ๋ฐฉ๋ฒ
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(201, defaultCorsHeader);
res.end()
}
โฐ 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'})
})
3๏ธโฃ ๋ชจ๋ ์์ฒญ์ ๋ํด url์ด๋ ๋ฉ์๋๋ฅผ ํ์ธํ ๋
โฐ ๋ฏธ๋ค์จ์ด๋ ํ๋ก์ธ์ค ์ค๊ฐ์ ๊ด์ฌํ์ฌ ํน์ ์ญํ ์ ์ํํ๋ค.
โฐ ๊ฐ์ฅ ๋จ์ํ ๋ฏธ๋ค์จ์ด์ธ ๋ก๊ฑฐ(logger)๋ ๋๋ฒ๊น ์ด๋, ์๋ฒ ๊ด๋ฆฌ์ ๋์์ด ๋๊ธฐ ์ํด console.log ๋ก ์ ์ ํ ๋ฐ์ดํฐ๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค.
โฐ ๋ฏธ๋ค์จ์ด ์ฌ์ด์ฌ์ด์ ๋ก๊ฑฐ๋ฅผ ์ฝ์ ํ์ฌ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ฑฐ๋, ๋๋ฒ๊น ์ ์ฌ์ฉํ ์ ์๋ค.
โฐ endpoint ๊ฐ '/' ์ด๋ฉด์, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ GET ์์ฒญ์ ๋ฐ์์ ๋ ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
โฐ req, res๋ ์์ฒญ, ์๋ต์ด๊ณ next๋ ๋ฏธ๋ค์จ์ด๋ฅผ ์คํํ๋ ์ญํ ์ด๋ค.
โฐ ๋ชจ๋ ์์ฒญ์ ๋์ผํ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ฉํ๋ ค๋ฉด app.use ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('LOGGED');
next();
};
app.use(myLogger);
// ๋ชจ๋ ์์ฒญ์ ๋์ผํ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ฉํ๋ค.
// ๋ชจ๋ ์์ฒญ์ ๋ํด LOGGED๊ฐ ์ถ๋ ฅ๋๋ค.
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๋ฅผ ํ์ฉํฉ๋๋ค.
console.log(`http request method is ${req.method}, url is ${req.url}`);
next();
};
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hello World!');
});
app.listen(3000);
4๏ธโฃ ์์ฒญ ํค๋์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋์ง ํ์ธํ ๋
โฐ HTTP ์์ฒญ์์ ํ ํฐ์ด ์๋์ง ํ๋จํ์ฌ, ์ด๋ฏธ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ผ ๊ฒฝ์ฐ ์ฑ๊ณต ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ณด๋ด๋ ๋ฏธ๋ค์จ์ด
app.use((req, res, next) => {
// ํ ํฐ์ด ์๋์ง ํ์ธ, ์์ผ๋ฉด ๋ฐ์์ค ์ ์์.
if(req.headers.token){
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user')
}
})
โ ํ ํฐ(Token)
โฐ ์ฃผ๋ก ์ฌ์ฉ์ ์ธ์ฆ์ ์ฌ์ฉํ๋ค.
'CodeStates > learning contents' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
S3) Unit 1. [์๋ฃ๊ตฌ์กฐ/์๊ณ ๋ฆฌ์ฆ] ์ฌ๊ท (0) | 2023.02.13 |
---|---|
Section 2. [๊ธฐ์ ๋ฉด์ ] (0) | 2023.02.10 |
S2) Unit 10. [Web Server] CORS (0) | 2023.02.06 |
S2) Unit 9. [React] Effect Hook (0) | 2023.02.02 |
S2) Unit 9. [React] React ๋ฐ์ดํฐ ํ๋ฆ (0) | 2023.02.02 |