SHIN
Node.js 실전 팁 20선
20편Express 같은 프레임워크의 내부를 이해하려면 내장 http 모듈부터 시작해야 합니다.
const http = require('http');
const server = http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({ message: 'Hello, World!' }));
});
server.listen(3000, () => {
console.log('서버 실행 중: http://localhost:3000');
});const http = require('http');
const { URL } = require('url');
const routes = new Map();
function addRoute(method, path, handler) {
routes.set(`${method.toUpperCase()}:${path}`, handler);
}
const server = http.createServer(async (req, res) => {
const url = new URL(req.url, `http://${req.headers.host}`);
const handler = routes.get(`${req.method}:${url.pathname}`);
res.setHeader('Content-Type', 'application/json');
if (!handler) {
res.writeHead(404);
return res.end(JSON.stringify({ error: 'Not Found' }));
}
try {
await handler(req, res, url);
} catch (err) {
res.writeHead(500);
res.end(JSON.stringify({ error: err.message }));
}
});
// 라우트 등록
addRoute('GET', '/health', (req, res) => {
res.writeHead(200);
res.end(JSON.stringify({ status: 'ok' }));
});
addRoute('GET', '/users', async (req, res) => {
const users = await db.findAll();
res.writeHead(200);
res.end(JSON.stringify(users));
});function parseBody(req) {
return new Promise((resolve, reject) => {
const chunks = [];
req.on('data', (chunk) => chunks.push(chunk));
req.on('end', () => {
const body = Buffer.concat(chunks).toString();
try {
resolve(JSON.parse(body));
} catch {
resolve(body);
}
});
req.on('error', reject);
});
}
addRoute('POST', '/users', async (req, res) => {
const body = await parseBody(req);
const user = await db.create(body);
res.writeHead(201);
res.end(JSON.stringify(user));
});const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem'),
};
https.createServer(options, (req, res) => {
res.end('HTTPS OK');
}).listen(443);const server = http.createServer(handler);
server.keepAliveTimeout = 65_000; // 65초
server.headersTimeout = 66_000; // keepAlive보다 약간 길게
// 요청 처리 타임아웃
server.setTimeout(30_000, (socket) => {
socket.destroy(); // 30초 초과 연결 강제 종료
});