: Node.js ํ๊ฒฝ์์ ์น ์๋ฒ ๋๋ API ์๋ฒ๋ฅผ ์ ์ํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ํ๋ ์์ํฌ
Express๋ฅผ ์ฌ์ฉํ๋ฉด, HTTP ๋ชจ๋๋ณด๋ค ํจ์ฌ ๋ ๊ฐ๋จํ๊ฒ ์น ์๋ฒ๋ฅผ ๋ง๋ค ์ ์๋ค.
npm install express
const express = require('express'); // Express ๋ชจ๋ ๋ถ๋ฌ์ค๊ธฐ
const app = express(); // ์๋ฒ ์คํ
const port = 3000; // ํฌํธ ๋ฒํธ ์ค์
app.listen()
app.listen(port, () => {
console.log(`Server is Running on port ${port}`);
// Server is Running on port 3000
});
: ํด๋ผ์ด์ธํธ ์์ฒญ์ HTTP ๋ฉ์๋์ ์๋ํฌ์ธํธ(URI)์ ๋ฐ๋ผ ์๋ฒ๊ฐ ์๋ตํ๋ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ๊ฒ
app.METHOD('/path', ํธ๋ค๋ฌ ํจ์)
app.METHOD('/path', ํธ๋ค๋ฌ ํจ์)
// ํํ์ด์ง(๋ฃจํธ ๋ผ์ฐํธ)์์ 'Hello World!'๋ผ๊ณ ์๋ต
app.get('/', (request, response) => {
response.send('Hello World!');
});
// ํํ์ด์ง(๋ฃจํธ ๋ผ์ฐํธ)์์ POST ์์ฒญ์ ์๋ต
app.post('/', (request, response) => {
response.send('Got a POST request');
});
// /user ๋ผ์ฐํธ์์ PUT ์์ฒญ์ ์๋ต
app.put('/user', (request, response) => {
response.send('Got a PUT request at /user');
});
// /user ๋ผ์ฐํธ์์ DELETE ์์ฒญ์ ์๋ต
app.delete('/user', (request, response) => {
response.send('Got a DELETE request at /user');
});
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send(<h1>'Hello World!'</h1>);
});
app.listen(port, () => {
console.log(`Server is Running on port ${port}`);
});
/
)์ ์์ฒญ์ 'Hello World!'๋ก ์๋ตํ๋ค.Middleware functions are functions that have access to the request object (
req
), the response object (res
), and the next function in the applicationโs request-response cycle.
Express - Writing middleware
: ๋ฏธ๋ค์จ์ด ํจ์๋ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ฒญ-์๋ต ์ฌ์ดํด ์์์ request
๊ฐ์ฒด, response
๊ฐ์ฒด, ๊ทธ๋ฆฌ๊ณ next()
ํจ์์ ๋ํด ๊ถํ์ ๊ฐ๋ ํจ์์ด๋ค.
์ฆ, ํด๋ผ์ด์ธํธ์๊ฒ ์์ฒญ์ ๋ฐ๊ณ , ์๋ต์ ๋ณด๋ด๊ธฐ ์ ๊น์ง ์์ฒญ๊ณผ ์๋ต์ ๋ชฉ์ ์ ๋ง๊ฒ ๊ฐ๊ณตํ๋ฉฐ, ๊ฑฐ์ณ๊ฐ๋ ํจ์๋ค์ ๋งํ๋ค.
ํ์ฌ ๋ฏธ๋ค์จ์ด ํจ์๊ฐ ์๋ต์ ์ข
๋ฃํ์ง ์๋ ๊ฒฝ์ฐ์๋, ๋ฐ๋์ next()
๋ฅผ ํธ์ถํ์ฌ ๋ค์ ๋ฏธ๋ค์จ์ด ํจ์๊ฐ ์คํ๋๋๋ก ํด์ผ ํ๋ค.
๋ฏธ๋ค์จ์ด๋ฅผ ์ด์ฉํ๋ฉด Node.js๋ง์ผ๋ก ๊ตฌํํ ์๋ฒ์์๋ ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ ์์
์ ๋ณด๋ค ์ฝ๊ณ ๊ฐ๋จํ๊ฒ ์์
ํ ์ ์๋ค.
์๋์์ ์์ฃผ ์ฌ์ฉํ๋ ๋ฏธ๋ค์จ์ด์ ํด๋น ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ ์๊ฐํ๋ค.
Node.js๋ก๋ง ๊ตฌํํ ์๋ฒ์์๋ HTTP ์์ฒญ์ body(payload)๋ฅผ ๋ฐ์ ๋ ๋ค์ ๋ณต์กํ ๋ฐฉ์์ผ๋ก body๋ฅผ ์ป์ ์ ์๋ค.
์์ฒญ body(payload)๋ฅผ chunck๋ก ๋ฐ์ Buffer์ ํฉ์น๊ณ , Buffer๋ฅผ ๋ฌธ์์ด๋ก ๋ณํํ๋ ์์
์ด ํ์ํ๋ค.
let body = [];
request.on('data', (chunck) => {
body.push(chunck);
}).on('end', () => {
body = Buffer.concat(body).toString();
});
โก๏ธ body-parser ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ณผ์ ์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
body-parser ๋ฏธ๋ค์จ์ด
: Node.js์์ ์์ฒญ body๋ฅผ ํ์ฑํด์ฃผ๋ ๋ฏธ๋ค์จ์ด๋ก 4 ๊ฐ์ง์ parser๋ฅผ ์ ๊ณตํ๋ค.
const express = require('express'); // ์๋ต app.use(express.json());
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(201, defaultCorsHeader); // writeHead ๋ฉ์๋ ์ด์ฉํด์ ํค๋ ์์ฑ
res.end()
}
โก๏ธ cors ๋ฏธ๋ค์จ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๊ณผ์ ์ ๊ฐ๋จํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋ค.
cors ๋ฏธ๋ค์จ์ด
: ๋ค์ํ ์ต์ ์ผ๋ก CORS๋ฅผ ํ์ฉํ ์ ์๊ฒ ๋๋ ๋ฏธ๋ค์จ์ด
์ค์น
npm install cors
๋ชจ๋ ์์ฒญ์ ๋ํด CORS๋ฅผ ํ์ฉ
const cors = require('cors'); // 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'}) }); // ๋๋ฒ์งธ ์ ๋ฌ์ธ์๋ก cors()๋ฅผ ์ ๋ฌํ๋ค.
๋ฏธ๋ค์จ์ด๋ ๋ง ๊ทธ๋๋ก ํ๋ก์ธ์ค ์ค๊ฐ์ ๊ด์ฌํ์ฌ ํน์ ํ ์ญํ ์ ์ํํ๋ค.
๋ก๊ฑฐ(logger)๋ ๋๋ฒ๊น
์ด๋ ์๋ฒ ๊ด๋ฆฌ์ ๋์์ ์ฃผ๊ธฐ ์ํด console.log()
๋ก ์ ์ ํ ๋ฐ์ดํฐ๋ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๋ฏธ๋ค์จ์ด๋ฅผ ๊ฑฐ์น๋ ๋์, ๋ฏธ๋ค์จ์ด ์ฌ์ด ์ฌ์ด์ ๋ก๊ฑฐ๋ฅผ ์ฝ์ ํ์ฌ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ณ ๋๋ฒ๊น ์ ์ฌ์ฉํ ์ ์๋ค.
ํน์ ์์ฒญ์ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ฉํ๊ณ ์ถ๋ค๋ฉด, ๋ ๋ฒ์งธ ์ ๋ฌ์ธ์๋ก ๋ฏธ๋ค์จ์ด ํจ์๋ฅผ ์ ๋ฌํ๋ค.
/
์ด๋ฉด์ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ GET ์์ฒญ์ ๋ฐ์์ ๋ ์ ์ฉ๋๋ ๋ฏธ๋ค์จ์ด์ด๋ค.๋ชจ๋ ์์ฒญ์ ๋์ผํ ๋ฏธ๋ค์จ์ด๋ฅผ ์ ์ฉํ๋ ค๋ฉด app.use()
๋ฅผ ์ฌ์ฉํ๋ค.
const express = require('express');
const app = express();
const myLogger = (req, res, next) => {
console.log('LOGGED');
next();
};
app.use(myLogger); // ๋ชจ๋ ์์ฒญ์ myLogger ๋ฏธ๋ค์จ์ด๋ฅผ ์คํํ๋ค.
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000);
// ์๋ต
const printMethodAndUrl = (req, res, next) => {
console.log(`http request method is ${req.method}, url is ${req.url}`);
next();
}
app.use(printMethodAndUrl);
// ์๋ต
๋ฏธ๋ค์จ์ด๋ฅผ ์ด์ฉํด HTTP ์์ฒญ์์ ํ ํฐ์ด ์๋์ง ํ๋จํ์ฌ ์ด๋ฏธ ๋ก๊ทธ์ธํ ์ฌ์ฉ์์ผ ๊ฒฝ์ฐ ์ฑ๊ณต, ์๋ ๊ฒฝ์ฐ ์๋ฌ๋ฅผ ๋ณด๋ผ ์ ์๋ค.
app.use((req, res, next) => {
if(req.headers.token) {
req.isLoggedIn = true;
next();
} else {
res.status(400).send('invalid user');
}
});
์ด ๊ธ์ ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํ์ฌ ์์ฑํ ๊ธ์
๋๋ค.
https://www.geeksforgeeks.org/middleware-in-express-js/
Hello World ์์ ์์ res.send์ h1ํ๊ทธ๋ ์ฑ๊ธ ์ฟผํ ์ด์ ์์ผ๋ก ๋ค์ด๊ฐ์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.