본문 바로가기
TIL/코드스테이츠 TIL

코드스테이츠 소프트웨어엔지지어링 부트캠프 +52,

by 안뇽! 2021. 9. 9.
반응형

Mini Node Server

Mini Node Server 예시

엄청나게 어려웠다. 뭐가뭔지 아직도 모르지만 그나마 알아낸걸 적는다.

전체코드

 const http = require('http');

const PORT = 5000;

const ip = 'localhost';

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

  console.log(
    `http request method is ${request.method}, url is ${request.url}`
  );

  if(request.method==='OPTIONS'){
   response.writeHead(200, defaultCorsHeader);
    // response.end();
    response.end('hello mini-server sprints');

  }
  if(request.method === 'POST' && request.url === '/upper'){
    let body = [];
    request.on('data', (chunk) => {
    body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      body = body.toUpperCase();
      response.writeHead(200, defaultCorsHeader);

      response.end(body);
    });
  } else if(request.method === 'POST' && request.url === '/lower'){
    let body = [];
    request.on('data', (chunk) => {
    body.push(chunk);
    }).on('end', () => {
    body = Buffer.concat(body).toString().toLowerCase();
    body = body.toLowerCase();
    response.writeHead(200, defaultCorsHeader);

    response.end(body);
    });
  } 


  else {
    response.statusCode = 404;
    response.end();
  }
});

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//preflighted request는 10초까지 허용된다.
};

상세 설명

서버 생성

createServer를 이용하여 웹 서버 객체를 만든다.

const http = require('http');

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

request의 메서드, url, 헤더

request는 객체인데, request에는 method와 url, header가 있다.

  • method는 항상 일반적인 HTTP 메서드/동사이다.
  • url은 전체 url서버에서 서버, 프로토콜, 포트를 제외한 것이다.
  • header는 소문자로만 표현된다. 일부 헤더를 반복해서 설정한다면 이 값은 헤더에 따라 덮어 씌워지거나 콤마로 구분된 문자열로 합쳐진다.

request

  • request.on('data',(chunk)=>{}) : 콜백 실행. data 처리하는 부분
  • request.on('end',콜백) : data 처리가 끝났음을 알려준다.
if(request.method === 'POST' && request.url === '/upper'){
    let body = [];
    request.on('data', (chunk) => {
    body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      body = body.toUpperCase();
      response.writeHead(200, defaultCorsHeader);

      response.end(body);
    });

respond HTTP 상태코드, 명시적인 헤더 데이터 전송

  • 상태코드 :
    response.statusCode = 404; //클라이언트에게 리소스를 찾을 수 없다고 알려준다.
  • 명시적인 헤더 데이터 전송

명시적으로 헤더를 설정하지 않는다면 헤더와 상태코드를 설정하는 메서드는 '암묵적인 헤더'를 사용한다고 가정한다.
원한다면 명시적으로 응답 스트림에 헤더를 작성할 수 있다.
헤더를 작성하는 메소드는 writeHead 메소드 이다.

response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});
if(request.method === 'POST' && request.url === '/upper'){
    let body = [];
    request.on('data', (chunk) => {
    body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      body = body.toUpperCase();
      response.writeHead(200, defaultCorsHeader);

      response.end(body);
    });
  • response.end() 메서드
    응답 종료,요청완료와 동시에 인수의 값을 클라이언트로 전송한다.

Preflighted request

CORS정책에 의해 유저들이 보호를 받는데, CORS정책중 하나가 Preflighted request이다.

본 요청을 보내기 전에 예비요청을 보내 서버로 부터 허락을 받는 과정중에서 예비 요청을 Preflighted request라고 한다.

HTTP메소드 중 OPTIONS 메소드가 사용된다. 예비 요청의 역할은 본 요청을 보내기 전 브라우저 스스로 이 요청을 보내는 것이 안전한지 확인하는 것이다.

if(request.method==='OPTIONS'){
   response.writeHead(200, defaultCorsHeader);
    // response.end();
    response.end('hello mini-server sprints');

  }

예비 요청이 왔을때 OK사인을 보내는 것이다. ( 상태코드 200은 OK)

반응형