[Node.js] 웹서버만들기 1

jungeundelilahLEE·2021년 2월 8일
0

Node.js

목록 보기
19/27

goal

  • 간단한 서버를 만들어보자

참고 - port 관리

  • 찾기
    : lsof i :[포트번호]
  • 예시
    :
  • 죽이기
    : kill -9 [PID 번호]

nodemon 실행 에러

  • clean exit - waiting for changes before restart
  • 해결 : app.listen을 빼먹음...

http모듈로 웹서버 만들기

const http = require('http');

const PORT = 5000;

const ip = 'localhost';

//! 정리

// http 모듈을 사용 - http 서버가 있어야, 웹 브라우저의 요청을 처리할 수 있으므로 http모듈을 사용한다.
// http 모듈은 createServer라는 메소드를 가지고 있다.
// createServer메서드의 인자로, 요청에 대한 콜백함수를 넣을 수 있다.
// 요청과 응답은 이벤트 방식 - 클라이언트로부터 요청이 왔을 때, 어떠한 응답을 보낼지 이벤트리스너를 등록해두어야 한다.
// 요청이 들어올 때마다, "매번" 콜백함수가 실행된다.
// 따라서, 이 콜백함수에 응답에 대한 내용을 작성해주어야 한다.

// request.on은 event와 같은의미  -- request.on (event(string), listener)
// 스트림의 "data", "end" 이벤트에, 이벤트리스너를 등록해서 데이터를 받을 수 있다. 
// on메소드는 request 인스턴스에 "data"이벤트의 이벤트핸들러를 bind해준다.
// request에서 "data"라는 이름의 이벤트가 발생한 경우, (chunk) => {} 라는 이벤트핸들러를 실행한다.
  // 1. readable stream인 request에 "data" 이벤트의 이벤트핸들러를 할당한다.
  // 2. 결과, request는 flowing mode로 switch되고, "data"이벤트가 발생한다 -> 재귀로 스트림의 청크들을 계속 받고
  // 3. 스트림의 모든 청크가 소진되면, "end" 이벤트가 발생한 후, flowing mode에서 paused mode로 전환되며, 데이터 전송이 완료된다. 
// "data"이벤트는 언제 발생할까? 
  // 스트림이 consumer에게 chunk of data의 소유권을 양도할 때 발생한다.

// statusCode 200 : 성공적으로 처리했을 때 쓰인다. 가장 일반적으로 볼 수 있는 HTTP 상태
// statusCode 201 : POST 나 PUT 으로 게시물 작성이나 회원 가입 등의 새로운 데이터를 서버에 생성하는(쓰는, 넣는) 작업이 성공했을 때 반환하는 것

// response.statusCode는 http 상태코드
// response.setHeader는 응답헤더설정
// response.writeHead는 명시적인 헤더 데이터 전송
// response.write로 응답 바디 전송


const server = http.createServer((request, response) => {
  
  if (request.method === "OPTIONS") {
    response.writeHead(200, defaultCorsHeader)
    response.end()
  }

  if (request.method === "POST") {
    if (request.url === "/lower") {
      let body = ""
      request
        .on("data", (chunk) => { 
          body = body + chunk
            console.log(chunk) // <Buffer 22 46 46 46 46 46 46 46 46 46 46 46 46 22>
            console.log(body)  // "FFFFFFFFFFFF"
            console.log("body1-----------------")
        })
        .on("end", () => {
          body = body.toLowerCase()
            console.log(body)  // "ffffffffffff"
            console.log("body2-----------------")
          response.writeHead(201, defaultCorsHeader)
          response.end(body)
        })
    } else if (request.url === "/upper") {
      let body = ""
      request
        .on("data", (chunk) => { 
          body = body + chunk
        })
        .on("end", () => {
          body = body.toUpperCase()
          response.writeHead(201, defaultCorsHeader)
          response.end(body)
        })
    } else {
      response.writeHead(404, defaultCorsHeader)
      response.end()
    }
  }

});

server.listen(PORT, ip, () => {
  console.log(`http server listen on ${ip}:${PORT}`);
});

const defaultCorsHeader = { 
  'Access-Control-Allow-Origin': '*', 
  // 특정 cross origin에서 리소스를 요청할경우, 서버가 해당 오리진에 대한 접근을 허용하기 위해 사용하는 응답 헤더
  // origin은 무조건 하나의 값만 가질 수 있다.
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS', // 허용할 메소드
  'Access-Control-Allow-Headers': 'Content-Type, Accept', // 허용할 헤더
  'Access-Control-Max-Age': 10 // preflight에 대한 유지시간
};
  • http 서버가 있어야 웹 브라우저의 요청을 처리할 수 있으므로, http모듈을 사용
  • http 모듈의 createServer메소드의 인자로 요청에 대한 콜백함수를 넣음
profile
delilah's journey

0개의 댓글