HTTP 모듈 (reateServer)
Http.createServer()
인수: 요청에 대한 콜백 함수(요청이 들어올 때마다 실행됨) === 콜백함수에는 응답을 적으면 됨
콜백의 매개변수: 요청, 응답에 대한 객체
Http.createServer() 메서드는 HTTP 서버를 만들기 위한 Node.js 내장 모듈의 메서드이다.
이 메서드는 requestListener 함수를 매개 변수로 받고 클라이언트가 요청 (request)을 보낼 때 마다 호출된다.
requestListener 함수는 두개의 매개 변수 (req, res)를 받는다.
- req 객체는 클라이언트의 요청 정보를 담고있다.
- res 객체는 서버에서 클라이언트로 응답 (response)을 보낼 때 사용된다.
HTTP 서버는 listen() 메서드를 사용하여 특정 포트에서 클라이언트의 요청을 대기한다.
요약하면 Http.createServer() 메서드는 요청이 발생할 때 마다
requestListener 함수를 호출, HTTP 서버를 만들어준다.
server 객체
http 모듈의 createServer() 메서드를 사용하면 server 객체를 생성할 수 있다.
server 객체의 메서드 | 설명 | |||
listen(port[, callback])) | 서버를 실행 | |||
close() | 서버를 종료 |
server 객체는 EventEmitter 객체를 기반으로 만들어 졌으므로 이벤트를 연결할 수 있다.
server 객체의 이벤트 | 설명 |
request | 클라이언트가 요청할 때 발생하는 이벤트 |
connection | 클라이언트가 접속할 때 발생하는 이벤트 |
close | 서버가 종료될 때 발생하는 이벤트 |
checkContinue | 클라이언트가 지속적인 연결을 하고 있을 때 발생하는 이벤트 |
upgrade | 클라이언트가 HTTP 업그레이드를 요청할 때 발생하는 이벤트 |
clientError | 클라이언트에서 오류가 발생할 때 발생하는 이벤트 |
response 객체
클라이언트에 웹 페이지를 제공하기 위해 response 객체를 사용한다.
response 객체는 request 이벤트 리스너의 두 번째 매개 변수로 전달되는 객체입니다.
response 객체의 메서드 | 설명 |
writeHead(statusCode, object) | 응답 헤더를 작성 |
end([data], [encoding]) | 응답 본문을 작성 |
과제 코드
const http = require("http");
const PORT = 4999;
const ip = "localhost";
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,
};
const server = http.createServer((request, response) => {
if (request.method === "OPTIONS") {
// CORS
response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
response.writeHead(204, defaultCorsHeader);
response.end();
}
if (request.method === "POST" && request.url === "/upper") {
// post url= /upper
let body = [];
request
.on("data", chunk => {
body.push(chunk);
})
.on("end", () => {
body = Buffer.concat(body).toString().toUpperCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
});
} else if (request.method === "POST" && request.url === "/lower") {
// post url= /lower
let body = [];
request
.on("data", chunk => {
body.push(chunk);
})
.on("end", () => {
body = Buffer.concat(body).toString().toLowerCase();
response.writeHead(200, defaultCorsHeader);
response.end(body);
});
} else {
// err /bad request
response.statusCode = 400;
response.end();
}
});
server.on("error", err => console.log(err));
server.listen(PORT, ip, () => {
console.log(`http server listen on ${ip}:${PORT}`);
});
CORS (Cross-Origin Resource Sharing)를 위한 기본 헤더를 객체로 정의.
Http 모듈의 createServer() 메서드를 호출하여 HTTP 서버 생성, 요청과 응답을 처리할 콜백 함수 전달.
요청이 OPTIONS 메서드일 경우, CORS를 위한 헤더를 설정하고 상태코드 204를 반환.
요청이 POST 메서드이고 URL이 /upper 또는 /lower인 경우.
요청 본문의 데이터를 담아둘 let body = [] 배열을 초기화한다.
request.on('data', chunk => {body.push(chunk);}) 는 요청 본문에서 데이터를 받아올 때마다 chunk라는 인자로 데이터를 받아와서 body 배열에 추가한다. 이는 data 이벤트를 처리하는 코드로, 요청 본문의 데이터가 많은경우 여러번 호출될 수 있다.
request.on('end' () => {body = Buffer.concat(body).toString().toUpperCase();......} 는 모든 데이터를 받아왔을때 호출된다. body 배열에 담긴 모든 데이터를 하나의 버퍼로 합치고 문자열로 변환후 대문자나 소문자로
(if문에 따라서) 바꿔준다.
마지막으로 response.writeHead(200, defaultCorsHeader) 로 HTTP 상태 코드 200과 CORS 헤더를 설정,
response.end(body) 로 변환된 문자열을 응답으로 보내게 된다.
else 에서는 잘못된 HTTP 요청이 들어온 경우에 예외 처리를 한다. 상태코드 400 (Bad Request)으로 설정하고 별도의 응답을 보내지 않는다.