
response.on("이벤트", 콜백함수), reques.on("이벤트", 콜백함수) 의 형태로 사용함http라는 변수에 저장하기server객체에 HTTP 요청이 올 때마다 createServer에 전달된 함수가 한 번씩 호출되게 하기request와 responseserver 객체에서 listen 메소드 호출하기const http = require('http'); // (1)
const PORT = 4999
const server = http.createServer((request, response) => { // (2)
// 여기서 작업이 진행됩니다!
});
server.listen(PORT) // (3)

POST나 PUT 메소드처럼 request body가 중요한 경우request객체는 ReadableStream인터페이스를 구현하고 있음data이벤트와 end이벤트에 이벤트 리스너를 등록해서 데이터 받기request스트림의 오류가 발생하면 스트림에서 'error'이벤트가 발생하면서 오류를 전달함request 스트림에 'error'리스너를 추가data이벤트에서 발생시킨 청크(2)는 Buffer 이며, 이 청크는 문자열 데이터임concat()) 문자열로 만들기(toString())let body = [];
request.on('error', (err) => {
console.error(err); // (1)
}).on('data', (chunk) => { // (2)
body.push(chunk); //(3)
}).on('end', () => { //(4)
body = Buffer.concat(body).toString();
// 여기서 헤더, 메서드, url, 바디를 가지게 되었고
// 이 요청에 응답하는 데 필요한 어떤 일이라도 할 수 있게 되었습니다.
})
response.setHeader(헤더)response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
response.writeHead(상태코드, 헤더): 명시적으로 응답 스트림에 헤더 작성하기response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
response.on('error', (err) => {
console.error(err);
});
response.write() : HTTP 응답 출력 스트림에 정보를 전달하기response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
response.end(): 스트림에 보낼 데이터의 마지막 비트를 선택적으로 전달response.end('<html><body><h1>Hello, World!</h1></body></html>');
const http = require('http');
http.createServer((request, response) => {
const { headers, method, url } = request;
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
response.on('error', (err) => {
console.error(err);
});
response.writeHead(200, {'Content-Type': 'application/json'})
const responseBody = { headers, method, url, body };
response.end(JSON.stringify(responseBody))
});
}).listen(8080);
let body = '';
request.on('data', (chunk) => {
body = body + chunk
})
OPTIONS로 들어옴 → OPTIONS 메소드일 때 대응을 추가해야함response.writeHead()와 response.end()를 적는 게 좋음const http = require('http');
const PORT = 4999;
const ip = 'localhost'; //기본값으로 localhost가 IP로 지정됨.
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*', //응답을 보내주고 싶은 client의 url
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
const server = http.createServer((request, response) => {
if(request.method === 'OPTIONS') {
response.writeHead(200, defaultCorsHeader);
response.end();
};
if(request.method === 'POST') {
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString(); //`body`에 전체 요청 바디가 문자열로 담겨있음
});
if(request.url === '/upper') {
request.on('end', ()=>{
response.writeHead(200, defaultCorsHeader);
response.end(body.toUpperCase());
})
}else if(request.url === '/lower') {
request.on('end', ()=>{
response.writeHead(200, defaultCorsHeader);
response.end(body.toLowerCase());
})
}
}else {
//에러로 처리, bad request
response.writeHead(400, defaultCorsHeader);
response.end();
}
console.log(
`http request method is ${request.method}, url is ${request.url}`
);
});
server.listen(PORT, ip, () => {
console.log(`http server listen on ${ip}:${PORT}`);
});
Node.js에서 사용할 수 있는 프레임워크인 Express를 활용하면 훨씬 간단하게 서버를 구현할 수 있음
Express 알아보러 가기
[Web Server] 기초 | Express
const express = require('express')
const app = express()
const port = 4999
//모든 요청과 응답에 CORS 헤더 붙이기
const cors = require('cors');
app.use(cors());
//POST 요청에 body 구조화하기
const jsonParser = express.json({strict: false});
app.get('/', (req, res) => {
res.send('This is mini-node-server')
})
app.post('/upper', jsonParser, (req, res) => {
console.log(req.body);
res.json(req.body.toUpperCase())
})
app.post('/lower', jsonParser, (req, res) => {
res.json(req.body.toLowerCase())
})
app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})
참고자료
HTTP 트랜잭션 해부