node.js의 트랜잭션 문서 정리

ys_sung blog·2020년 11월 4일
1
post-custom-banner

node.js의 트랜잭션 문서 정리

HTTP 트랜젝션 문서를 개인적인 학습목적으로 정리함.

원문: https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/


  • 서버 만들고 포트에 연결

    const http = require('http');
    
    const server = http.createServer((request, response) => {
      // 여기서 작업이 진행됩니다!
    });
    
    server.listen(PORT, ip, () => {
       //
    })

<request 객체>

  • request 객체에는 유용한 프로퍼티들이 있다

    • request.method
    • request.url (전체 url에서 서버, 프로토콜, 포트를 제외한 것, ex) /upper )
    • request.header
  • 그렇다면 request.body도 있을까? ⇒ x

    • buffer/ stream이란? 데이터를 전달할때 버퍼형식으로 전달하고 효율을 위해 잘게 쪼개는데 그 방식이 스트림이다

      let body = [];
      request.on('data', (chunk) => {
        body.push(chunk);
      }).on('end', () => {
        body = Buffer.concat(body).toString();
      })
      
      //여기서 chunk는 데이터를 잘게 쪼갠 단위이다
      //데이터를 스트림으로 받아와서 배열에 푸시한 다음
      //Buffer.concat으로 다시 하나의 요소로 합쳐서 읽을수 있게 toString()했다
      
      //이렇게 코드를 쓰지 않고 더 간단한 방법이 있는 것 같다
      //어떤 일이 일어나는지 이해하기 위한 코드인듯
  • 오류에 대한 이벤트리스너도 등록해야 한다(에러 핸들링)

    request.on('error', (err) => {
    	//오류가 발생하면 error 이벤트 발생하고
    	//여기에서 처리 코드 써넣어야
      console.err(error)
    })

<Response 객체>

  • 상태코드 설정 → 헤더 설정 → 바디 전송

  • 상태코드 설정

    reponse.statusCode = 404
    //숫자는 http 상태코드
    //기본값은 200(성공응답)
  • 응답헤더 설정< response.setHeader() 방식 >

    response.setHeader('Content-Type', 'application/json');
    response.setHeader('X-Powered-By', 'bacon');
    
    //'Content-Type' : 응답으로 반환된 컨텐츠의 데이터타입 설정
      //텍스트 : "text/html; charset=utf-8"
      //JSON 객체 : "application/json"
    	//다른 것들엔 뭐가 있을까?
  • 더 명시적인 방식으로 헤더 설정도 가능하다< response.writeHead() >

    • 암묵적인 헤더? 명시적인 헤더?

      response.writeHead(200, {
        'Content-Type': 'application/json',
        'X-Powered-By': 'bacon'
      });
      //첫번째 인자에 상태코드
  • 응답 바디 전송< response.write() >

    response.write('<html>');
    response.write('<body>');
    response.write('<h1>Hello, World!</h1>');
    response.write('</body>');
    response.write('</html>');
    response.end();
    
    //요청 전송이 끝날 때 response.end()
    //response.end('<html><body><h1>Hello, World!</h1></body></html>');로도 작성 가능
    
    • 바디 전송 전에 헤더부터 설정해야 하는 것에 유의
  • 응답도 에러핸들링 해줘야 한다


<예제>

  • 클라이언트가 보낸 요청을 그대로 응답하는 서버

    const http = require('http');
    
    http.createServer((request, response) => {
      const { headers, method, url } = request;
      let body = [];
      request.on('error', (err) => {
        console.error(err);
      }).on('data', (chunk) => {
        body.push(chunk);
      }).on('end', () => {
        body = Buffer.concat(body).toString();
    
        response.on('error', (err) => {
          console.error(err);
        });
    //응답의 에러는 end 이벤트의 콜백 안에서 처리하는구나
    
        response.statusCode = 200;
        response.setHeader('Content-Type', 'application/json');
        // response.writeHead(200, {'Content-Type': 'application/json'})
        
        //headers, method, url, 'body' 프로퍼티가 있는 객체를 할당
        const responseBody = { headers, method, url, body }; 
    
        //JSON 객체로 변환해서 응답 body 전송
        response.write(JSON.stringify(responseBody));
        response.end();
        // response.end(JSON.stringify(responseBody)) 도 가능
    
      });
    }).listen(8080);
  • 위 서버에 조건 추가

    • 요청 메서드 POST
    • URL /echo
const http = require('http');

http.createServer((request, response) => {
  if (request.method === 'POST' && request.url === '/echo') {
    let body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      response.end(body);
    });
  } else {
    response.statusCode = 404;
    response.end();
  }
}).listen(8080);

//간단한 조건문으로 메소드와 URL에 따라 다른 응답을 할 수 있다
  //조건에 맞으면('POST', /echo) 요청을 그대로 응답
  //조건에 맞지 않으면 클라이언트 에러
//URL에 따른 분기: 라우팅
//express 프레임워크로 라우팅하는 방법도 학습
  • pipe 사용 (위 코드를 간략하게 작성할 수 있다)
const http = require('http');

http.createServer((request, response) => {
  if (request.method === 'POST' && request.url === '/echo') {
    request.pipe(response);
  } else {
    response.statusCode = 404;
    response.end();
  }
}).listen(8080);

//객체(여기서는 request 객체) .pipe (객체, 여기서는 response 객체)
  • stderr(Standard error) / stdout(Standard output)에 오류 로깅

    • stdout?

    • stderr?

    • 에러 문서 : https://nodejs.org/api/errors.html

      const http = require('http');
      
      http.createServer((request, response) => {
        request.on('error', (err) => {
          console.error(err);
      //이 부분이 중요한 듯, 요청에 오류가 있을 때 오류코드 '응답'
          response.statusCode = 400;
          response.end();
        });
      
      //응답에 오류가 있을 때 그 에러 콘솔에 표시
        response.on('error', (err) => {
          console.error(err);
        });
      
        if (request.method === 'POST' && request.url === '/echo') {
          request.pipe(response);
        } else {
      //조건이 맞지 않을 때 오류코드 설정하고 응답(라우팅)
          response.statusCode = 404;
          response.end();
        }
      }).listen(8080);

<정리>

문서를 읽었으면 다음 질문에 답할 수 있어야 한다

  • 요청 핸들러 함수로 HTTP 서버의 인스턴스를 생성하고 특정 포트로 서버를 열 수 있습니다.
    • ok
  • request 객체에서 헤더, URL, 메서드, 바디 데이터를 가져올 수 있습니다.
    • request.url / request.method 등, 구조분해할당 사용하면 더 편함
  • URL이나 request 객체의 데이터에 기반을 둬서 라우팅을 할 수 있습니다.
    • 조건문으로 분기.
  • response 객체로 헤더, HTTP 상태 코드, 바디 데이터를 보낼 수 있습니다.
    • statusCode(), setHeader(), writeHead(), wirte()
  • request 객체에서 response 객체로 데이터를 파이프로 연결할 수 있습니다.
    • request객체.pipe(response객체)
  • request와 response 스트림 모두에서 스트림 오류를 처리할 수 있습니다.
    • 아직 애매하다. 예제 참고하며 학습
post-custom-banner

0개의 댓글