ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Node.js를 사용하여 서버 생성하기
    Node 2023. 1. 20. 08:48

    nodejs로 간단하게 웹 서버를 만드는 방법을 정리한다.
    참고 자료 : https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/

    node 명령어로 js 파일을 실행하여 서버를 켤 수 있다.

     

    HTTP 트랜잭션 해부 | Node.js

    Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

    nodejs.org

    서버 생성

    const http = require('http');
    
    const server = http.createServer((req, res) => {
      res.write('<p>Hello Worlds!</p>'); // HTML을 반환할 수도 있다.
      res.end('<h2>END</h2>'); 
    });
    
    server.listen(3065, () => {
      console.log("server start.");
    });
    
    // 또는 // 
    
    const server = http.createServer();
    server.on('request', (request, response) => {
      res.write('<p>Hello Worlds!</p>');
      res.end('<h2>END</h2>'); 
    });
    • 위와 같이 http.createServer를 통해서 웹 서버 객체를 만들 수 있다.
    • createServer에 서버에서 일어날 활동을 작성합니다.
    • request 객체 내부에는 headers, method, url등이 들어있다.
    • method와 url을 보고 각 메소드에 맞는 응답을 할 수 있다.

    method와 url

    const http = require('http');
    
    const server = http.createServer((req, res) => {
      console.log(req.method, req.url);
      if(req.method === 'GET') {
      	if(req.url === '/test/api') {
        	res.write('GET');
        }
      } else if(req.method === 'POST') {
      	if(req.url === '/test/api') {
        	res.write('POST');
        }  	
      } else if(req.method === 'DELETE') {
      	if(req.url === '/test/api') {
        	res.write('DELETE');
        }  	
      } else if(req.method === 'PUT') {
      	if(req.url === '/test/api') {
        	res.write('PUT');
        }  	
      }
      res.end('end');
    });
    
    server.listen(3065, () => {
      console.log("server start.");
    });

    Request body

    • POST나 PUT 메소드 request의 body에는 클라이언트에서 전송된 데이터가 들어와 있다.
    let body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
    });
    • 'data'와 'end' 이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.
    • 받은 데이터는 body에 저장되며, end에서 데이터를 처리하여 reponse에 담아 보낼 수 있다.

    오류

    request.on('error', (err) => {
      // 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
      console.error(err.stack);
    });
    • 오류가 발생하면, 'error' 이벤트 리스너를 통해서 에러 메세지를 출력하고 에러 상황을 관리한다.

    Response 하기

    • 응답을 하기위해서 reponse의 상태코드를 지정할 수 있다.
    response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.
    
    or
    
    response.statusCode = 200; // 정상 작동
    
    or
    
    response.statusCode = 201; // 새로운 리소스가 생성되었음을 알린다.

    🍩 200번대는 성공, 400번대는 요청 오류 (클라이언트 오류) 500번대는 서버 오류이다.

    • 또한, setHeader로 헤드를 설정할 수도 있다.
    response.setHeader('Content-Type', 'application/json');
    response.setHeader('X-Powered-By', 'bacon');
    • 위의 두 코드를 합한 방법으로 더 간단한 writeHead가 있다.
    response.writeHead(200, {
      'Content-Type': 'application/json',
      'X-Powered-By': 'bacon'
    });
    • 작성한 body의 내용을 response에 담아 보낼 수 있는데, write 나 end를 사용한다.
    response.write('Hello' + body);
    response.end();
    
    or
    
    response.end("Hello" + body);
    • end를 사용한 이후에는 write를 사용할 수 없다.
    if (method === 'POST') {
        let body = [];
        request.on('data', (chunk) => {
          body.push(chunk);
        }).on('end', () => {
          body = Buffer.concat(body).toString();
          // body에 문자열로 변환된 request body의 내용이 담겨있다.
          response.end(body.toUpperCase());
          // 대문자로 변환해서 response에 담아 보낸다.
        });
    } else {
         response.statusCode = 404;
         response.end("ERROR Method");
    }
    • 위와 같이 모든 매소드에 대해서 작동할 수 있도록 코드를 작성해야 한다.
    • 어떤 매소드의 request가 올지 모르기 때문이다.
      (에러를 방지한다.)
Designed by Tistory.