ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] http 서버 생성 - http.createServer() 함수
    node.js 2022. 2. 5. 23:19

    node.js에서 http 서버 만들기

    http.createServer() 함수로 request를 받고 response할 수 있는 서버(http.server) 객체를 만든다.

    http.createServer의 인자로 있는 callback 함수는 request, response를 인자로 하고 있으며 각각 요청과 응답에 관한 정보를 가지고 있다.

     

    전체 코드

    const http = require("http");
    
    let app = http.createServer(function (request, response) {
    	
        //응답 url 
        const _url = request.url;
        
        //URL 객체 생성 - url의 정보를 object 형식으로 보여준다.
        const test_url = new URL(_url, "http://localhost:3000/");
        
        //url 정보에서 pathname만 추출
        let pathname = test_url.pathname;
        
        //routing -> pathname === "/test"이면 http://localhost:3000/test 이런 형식이다.
        if(pathname === "/"){
        
            //response.writeHead(<http status code>, <header info>) -- response header에 대한 정보를 기록한다
            //처음에는 200, 404와 같은 http 상태코드가 들어가고, 헤더 정보에는 charset 정보나 
            //response의 형식 등이 적힌다.
            response.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' }); 
    
            //본문에 내용 작성 (ex/ html이면 body)
            response.write('<h1>Hello World!</h1>');
    
            //응답을 종료, 마찬가지로 내용을 작성할 수 있다.
            response.end('<h1>Bye World!</h1>');
    	}
        else if(pathname ==="/test"){
        	response.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
            response.end('<h1>test page</h1>');
        }
        else{
        response.writeHead(404);
        response.end("Not found");
        }
            
        })
    
    //<http server object>.listen(<port number>, <callback>)
    //서버와 연결할 포트 번호 지정, 연결 후 실행될 callback 함수 선언
    app.listen(3000);

     

    실행결과

    URL 객체

    const _url = request.url;
    const test_url = new URL(_url, "http://localhost:3000/");

    URL 함수로 url을 편하게 다룰수 있다. 

    "http://localhost:3000/"가 베이스 url이고 _url은 요청의 url을 따왔다.

     

    URL 객체 생성자의 설명을 보면

    var URL: new (url: string | URL, base?: string | URL) => URL
    The URL interface represents an object providing static methods used for creating object URLs.
    URL 인터페이스는 Object URLs(디스크에 있는 파일들을 가리키는 URLs)를 생성하기 위해 쓰이는 정적인 메소드들을 제공하는 객체를 나타낸다.

    라고 되어 있다. 

     

    이 객체를 콘솔에 출력해보면 

    URL {
      href: 'http://localhost:3000/',
      origin: 'http://localhost:3000',
      protocol: 'http:',
      username: '',
      password: '',
      host: 'localhost:3000',
      hostname: 'localhost',
      port: '3000',
      pathname: '/',
      search: '',
      searchParams: URLSearchParams {},
      hash: ''
    }

    위와 같은 정보들이 나온다.

     

    이 객체로 부터 여러 정보를 가져올 수 있다.

    에를 들어,

     

    let pathname = test_url.pathname;

    위와 같은 함수로 request url의 path name을 가져올 수 있다.

    이를 이용하여 라우팅을 구현할 수 있다.

     

    routing

    const test_url = new URL(_url, "http://localhost:3000/");
    
      //url 정보에서 pathname만 추출
      let pathname = test_url.pathname;
    
      //routing -> pathname === "/test"이면 http://localhost:3000/test 이런 형식이다.
      if (pathname === "/") {
        //response.writeHead(<http status code>, <header info>) -- response header에 대한 정보를 기록한다
        //처음에는 200, 404와 같은 http 상태코드가 들어가고, 헤더 정보에는 charset 정보나
        //response의 형식 등이 적힌다.
        response.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
    
        //본문에 내용 작성 (ex/ html이면 body)
        response.write("<h1>Hello World!</h1>");
    
        //응답을 종료, 마찬가지로 내용을 작성할 수 있다.
        response.end("<h1>Bye World!</h1>");
      } else if (pathname === "/test") {
        response.writeHead(200, { "Content-Type": "text/html; charset=utf-8" });
        response.end("<h1>test page</h1>");
      } else {
        response.writeHead(404);
        response.end("Not found");
      }

    if 문을 통해 각 path name 마다 다른 로직을 처리할 수 있다.

    pathname === "/test"이면 http://localhost:3000/test 이런 식의 request가 넘어왔다는 뜻이고, 그에 대한 처리를 할 수 있다.

    else문을 적절히 사용하여 설정하지 않은 url의 요청이 왔을 경우도 처리할 수 있다.

     

    http://localhost:3000/test
    http://localhost:3000/JackCokebb

     

JackCokebb dev blog