Node.js로 서버 만들기(HTTP 트랜잭션)

Donggu(oo)·2022년 12월 8일
0

Node.js

목록 보기
3/9
post-thumbnail

1. 서버 생성


  • 모든 node 웹 서버 애플리케이션은 웹 서버 객체를 만들어야 한다. 이 때 createServer()를 이용하여 server 객체를 생성 한다.
  • 이 서버로 오는 HTTP 요청마다 createServer에 전달된 함수가 한 번씩 호출된다. createServer가 반환한 Server 객체는 EventEmitter이다.
// 서버 사용을 위해 http 모듈을 변수에 담는다.(모듈과 변수 이름은 달라도 된다)
const http = require('http');
>
const server = http.createServer((request, response) => {
  // 여기서 작업이 진행됩니다!
});
// 위의 문법은 아래의 문법을 축약한 형태이다.
const server = http.createServer();  // `server` 객체를 생성하고 리스너를 추가

server.on('request', (request, response) => {
  // 여기서 작업이 진행됩니다!
});

2. 요청 바디 작성


  • 서버를 생성한 후, 사용자로 부터 http 요청이 들어오면 블럭내부의 코드를 실행해서 응답한다.
  • data와, end 이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.
  • data 이벤트에서 발생시킨 chunkBuffer이다. 이 chunk가 문자열 데이터이기 때문에 data를 배열에 담고 end 이벤트에서 이어붙인 다음 문자열로 만드는 것이 가장 좋은 방법이다.
const http = require('http');

const server = http.createServer((request, response) => {
    let body = [];
    request
        .on('data', (chunk) => {
            body.push(chunk);  // data를 배열(body)에 담고
        })
        .on('end', () => {
            body = Buffer.concat(body).toString();  // 이어붙인 다음 문자열로 변환
        });
});

EventEmitter

  • 노드에서는 대부분의 이벤트를 비동기 방식으로 처리하며, 비동기 방식으로 이벤트를 전달한다.
메서드설명
on(event, listner)지정한 이벤트 리스너를 추가(계속 연결한 상태 유지)
once(event, listner)지정한 이벤트의 리스너를 추가하지만 한 번 실행한 후에는 자동으로 리스너 제거
removeListner(evnet, listner)지정한 이벤트에 대한 리스너를 제거함

3. 응답 헤더, 바디 작성


  • 클라이언트에 웹 페이지를 제공하기 위해 response 객체의 메서드인 writeHeadend를 사용한다.
  • response 객체는 서버로 웹브라우저나 또는 앱으로 부터 어떤 요청이 있을 때 사용자 측으로 값을 반환해 줄 때 사용하는 객체이다.
  • 실제 코드 값을 end() 함수로 전달하면 브라우저는 해당 컨텐츠를 받은 후 html 형태로 화면에 출력한다.

기본 문법

response.setHeader([statusCode], [object]);
response.end([data], [encoding]);
const http = require('http');

const server = http.createServer((request, response) => {
    let body = [];
    request
        .on('data', (chunk) => {
            body.push(chunk);
        })
        .on('end', () => {
            body = Buffer.concat(body).toString();
            response.writeHead(200, defaultCorsHeader);  // 응답 헤더 작성
            response.end(body.toUpperCase());  // 응답 바디 작성
        });
});

CORS(Cross-Origin Resource Sharing)

const defaultCorsHeader = {
  // 모든 도메인을 허용한다.
  'Access-Control-Allow-Origin': '*',
  // 메서드는 GET, POST, PUT, DELETE, OPTIONS만 허용한다.
  'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
  // 헤더에는 Content-Type과 Accept만 사용 가능하다.
  'Access-Control-Allow-Headers': 'Content-Type, Accept',
  // preflight request는 10초까지 허용된다.
  'Access-Control-Max-Age': 10
};

4. 서버 실행


  • server 객체의 메서드 listen을 사용하여 서버를 실행한다.

기본 문법

server.listen(port, ip, [, callback]))
  • listen 함수로 4999번 포트를 가진 서버를 실행한다.
  • 서버가 실행된 것을 확인하기 콘솔창에서 확인하기 위해 http server listen on 로그를 출력한다.
const http = require('http');

const server = http.createServer((request, response) => {
    let body = [];
    request
        .on('data', (chunk) => {
            body.push(chunk);
        })
        .on('end', () => {
            body = Buffer.concat(body).toString();
            response.writeHead(200, defaultCorsHeader);
            response.end(body.toUpperCase());
        });
});

server.listen(4999, 'localhost', () => {  // 4999번 포트를 가진 서버 실행
  console.log(`http server listen on`);
});

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 http = require('http');
const PORT = 4999;
const ip = 'localhost';

const server = http.createServer((request, response) => {
  if (request.method === 'OPTIONS') {
    response.writeHead(200, defaultCorsHeader);
    response.end('hello mini-server sprints');
    console.log(request.method)
  }

  if (request.method === 'POST' && request.url === '/upper') {
    let body = [];
    request
      .on('data', (chunk) => {
        body.push(chunk);
      })
      .on('end', () => {
        body = Buffer.concat(body).toString();
        response.writeHead(200, defaultCorsHeader);
        response.end(body.toUpperCase());
      });
  } else if (request.method === 'POST' && request.url === '/lower') {
    let body = [];
    request
      .on('data', (chunk) => {
        body.push(chunk);
      })
      .on('end', () => {
        body = Buffer.concat(body).toString();
        response.writeHead(200, defaultCorsHeader);
        response.end(body.toLowerCase());
      });
  } else {
    response.statusCode = 404;
    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}`);
});

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

0개의 댓글

관련 채용 정보