JavaScript/node.js

늦은 node.js basic-server 만들기...

짱닭 2020. 11. 18. 22:03
반응형

기본설정

expressjs.com/ko/starter/hello-world.html

 

const http = require('http');
const { report } = require('process');

const PORT = 5000;

const ip = 'localhost';

서버설정 ( 라우팅, CORS, 에러 )

request.on()에서 'data', 'end' 처럼 이벤트에 콜백함수가 붙은것은 모두 비동기로 처리된다.

const server = http.createServer((request, response) => {
  console.log(
    `http request method is ${request.method}, url is ${request.url}`
  );

  //request 객체의 .method로 요청 메서드를 분기한다 (라우팅)
  if (request.method === 'OPTIONS') {
    response.writeHead(200, defaultCorsHeader);
    response.end();
  }
//request 객체의 .url로 요청 경로를 분기한다 (라우팅)
  if (request.method === 'POST') {
    if (request.url === '/lower') {
        let data = '';
        request.on('data', chunk => {
        data = data + chunk;
      });

//request 객체의 .method로 요청 메서드를 분기한다 (라우팅)
//request 객체의 .url로 요청 경로를 분기한다 (라우팅)
//POST 요청의 body(payload)부분은 request.on()안에서 data 이벤트?가 발생했을 때 chunk(변수명)으로 받는다.
받은 payload는 json이나 Buffer 형태이기 때문에 위처럼

let data='';로 선언해서 data = data + chunk;로 받거나,
let body=[]
request.on('data', (chunk) => {
body.push(chunk);
}
위처럼 배열로 받아서 밑의 request.on('end', ...) 부분으로 넘겨준다.

      request.on('end', () => {
        data = data.toLowerCase();
        response.writeHead(201, defaultCorsHeader); //응답헤더 설정
        response.end(data); //응답 (String, Buffer 타입만 응답할 수 있다.)
      });
    }else if (request.url === '/upper') {
      let data = '';
      request.on('data', chunk => {
      data = data + chunk;
      });
      request.on('end', () => {
        data = data.toUpperCase();
        response.writeHead(201, defaultCorsHeader);
        response.end(data);
      });
    }
  }else if(request.method === 'GET') {
    if(request.url !== '/'){ //에러 핸들링
      response.writeHead(404, defaultCorsHeader);
      response.end('error');
    }
  }
});

에러 핸들링은 GET 메서드로 오는 요청 중에서 허용한 url이 아닌 경우
404 상태메시지와 'error' 문자열을 응답으로 보낸다.


//ip와 PORT로 전달된 주소로 오는 요청을 받는다.
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
};
반응형