response.on("이벤트", 콜백함수)
, reques.on("이벤트", 콜백함수)
의 형태로 사용함http
라는 변수에 저장하기server
객체에 HTTP 요청이 올 때마다 createServer
에 전달된 함수가 한 번씩 호출되게 하기request
와 response
server
객체에서 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 트랜잭션 해부