Express : Node.js ํ๊ฒฝ์์ ์น ์๋ฒ, API ์๋ฒ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ
1) npm install express
๋ช
๋ น์ผ๋ก express๋ฅผ ์ค์นํ๋ค.
2) ๊ฐ๋จํ ์น ์๋ฒ ๋ง๋ค๊ธฐ
const express = require('express')
const app = express()
// 3000๋ฒ ํฌํธ ์ฐ๊ฒฐ
const port = 3000
app.get('/', (req, res) => {
res.send('Hi')
})
app.listen(port, () => {
console.log(`Open port ${port}`)
})
3) ๋ผ์ฐํ : ๋ฉ์๋์ url์ ๋ฐ๋ผ ๋ถ๊ธฐ(Routing)ํ๊ธฐ
๋ผ์ฐํ
(Routing) : ํน์ ๋ฉ์๋์ url( /lower
, /upper
... )๋ก ๋ถ๊ธฐ์ ์ ๋ง๋๋ ๊ฒ
ํด๋ผ์ด์ธํธ๋ ํน์ ํ HTTP ์์ฒญ ๋ฉ์๋(GET, POST ...)์ ํจ๊ป ์๋ฒ์ ํน์ URI(๋๋ ๊ฒฝ๋ก)๋ก HTTP ์์ฒญ์ ๋ณด๋ธ๋ค. ๋ผ์ฐํ ์ ํด๋ผ๋ฆฌ์ธํธ ์์ฒญ์ ํด๋นํ๋ Endpoint์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์๋ตํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ ๊ฒ์ด๋ค.
const router = express.Router()
router.get('/lower', (req, res) => {
res.send(data);
})
router.post('/lower', (rea, res) => {
// ... ์๋ต
})
=> Express๋ ํ๋ ์์ํฌ ์์ฒด์์ ๋ผ์ฐํฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ฏธ๋ค์จ์ด(Middleware) : ํ๋ก์ธ์ค ์ค๊ฐ์ ๊ด์ฌํ์ฌ ํน์ ์ญํ ์ ์ํํ๋ค.
์๋ ๊ทธ๋ฆผ์ endpoint๊ฐ /
์ด๋ฉด์, ํด๋ผ์ด์ธํธ๋ก๋ถํฐ GET
์์ฒญ์ ๋ฐ์์ ๋ ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด์ด๋ค.
๋ฏธ๋ค์จ์ด ์์ฑ์ ํ๋ผ๋ฏธํฐ ์์์ ์ ์ํด์ผ ํ๋ค. (req, res, next)
req
: ์์ฒญ(request) , res
: ์๋ต(response) , next
: ๋ค์ ๋ฏธ๋ค์จ์ด๋ฅผ ์คํํ๋ ์ญํ
์์ฃผ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด
1) POST ์์ฒญ ๋ฑ์ ํฌํจ๋ body(payload)๋ฅผ ๊ตฌ์กฐํํ ๋(์ฝ๊ฒ ์ป์ด๋ด๊ณ ์ ํ ๋)
2) ๋ชจ๋ ์์ฒญ/์๋ด์ CORS ํค๋๋ฅผ ๋ถ์ฌ์ผ ํ ๋
3) ๋ชจ๋ ์์ฒญ์ ๋ํด url์ด๋ ๋ฉ์๋๋ฅผ ํ์ผํ ๋
4) ์์ฒญ ํค๋์ ์ฌ์ฉ์ ์ธ์ฆ ์ ๋ณด๊ฐ ๋ด๊ฒจ์๋์ง ํ์ธํ ๋
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-parser ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ ๊ณผ์ ์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
const bodyParser = require('body-parser');
const jsonParser = bodyParser.json();
// ... ์๋ต
app.post('/users', jsonParser, function (req, res) {
})
=> Express v4.16.0 ๋ถํฐ๋ body-parser๋ฅผ ๋ฐ๋ก ์ค์น x, Express ๋ด์ฅ ๋ฏธ๋ค์จ์ด์ธ express.json() ์ฌ์ฉ
const jsonParser = express.json({strict: false});
// ... ์๋ต
app.post('/api/users', jsonParser, function (req, res) {
})
Node.js HTTP ๋ชจ๋์ ์ด์ฉํ ์ฝ๋์ CORS ํค๋๋ฅผ ๋ถ์ด๋ ค๋ฉด, writeHead
๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ๋ผ์ฐํ
๋ง๋ค ํค๋๋ฅผ ๋งค๋ฒ ๋ฃ์ด์ฃผ์ด์ผ ํ๋ฉฐ, OPTIONS
๋ฉ์๋์ ๋ํ ๋ผ์ฐํ
๋ ๋ฐ๋ก ๊ตฌํํด์ผํ๋ค.
๊ทธ๋ฌ๋ cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ณผ์ ์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
const cors = require('cors');
// ... ์๋ต
// ๋ชจ๋ ์์ฒญ์ ๋ํด CORS ํ์ฉ
app.use(cors());
// ํน์ ์์ฒญ์ ๋ํด CORS ํ์ฉ
app.get('/products/:id', cors(), function (req, res, next) {
res.json({msg: 'This is CORS-enabled for a Single Route'})
})
๋ก๊ฑฐ(logger) : ๋๋ฒ๊น
์ด๋, ์๋ฒ ๊ด๋ฆฌ์ ๋์์ด ๋๊ธฐ ์ํด console.log
๋ก ์ ์ ํ ๋ฐ์ดํฐ๋ ์ ๋ณด ์ถ๋ ฅ
const express = require('express');
const app = express();
const myLogger = function (req, res, next) {
console.log('Logged');
next();
};
// ํน์ endpoint๊ฐ ์๋, ๋ชจ๋ ์์ฒญ์ ๋์ผํ ๋ฏธ๋ค์จ์ด ์ ์ฉํ๋ ค๋ฉด app.use ์ฌ์ฉ
app.use(myLogger);
app.get('/', function (req, res) {
res.send('Hi');
});
app.listen(3000);
app.use((req, res, next) => {
// ํ ํฐ์ด ์๋์ง ํ์ธ, ์์ผ๋ฉด ๋ฐ์์ค ์ ์๋ค.
if(req.headers.token) {
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user')
}
})
์ ์ฝ๋๋ HTTP ์์ฒญ์์ ํ ํฐ์ ํตํด ๋ก๊ทธ์ธ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ๋ฏธ๋ค์จ์ด ์์์ด๋ค.