Node.js

HTTP 모듈 (reateServer)

언젠간코딩잘함 2023. 4. 4. 23:17

Http.createServer()

 
const http = require("http");

//create a server object:
const server = http.createServer((request, response) => {});
 

인수: 요청에 대한 콜백 함수(요청이 들어올 때마다 실행됨) === 콜백함수에는 응답을 적으면 됨
콜백의 매개변수: 요청, 응답에 대한 객체

 

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}`);
});

 
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,
};
 

CORS (Cross-Origin Resource Sharing)를 위한 기본 헤더를 객체로 정의.

 

 

 
const server = http.createServer((request, response) => {
 

Http 모듈의 createServer() 메서드를 호출하여 HTTP 서버 생성, 요청과 응답을 처리할 콜백 함수 전달.

 

 

 
if (request.method === "OPTIONS") {
    // CORS
    response.setHeader("Access-Control-Allow-Origin", "http://127.0.0.1:5500");
    response.writeHead(204, defaultCorsHeader);
    response.end();
  }
 

요청이 OPTIONS 메서드일 경우, CORS를 위한 헤더를 설정하고 상태코드 204를 반환.

 

 

 
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();
  }
});
 

요청이 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)으로 설정하고 별도의 응답을 보내지 않는다.