Node.js TIL 01

Nabang Kim·2021년 8월 6일
0

Node.js

목록 보기
1/6
post-thumbnail

2021년 8월 5일에 작성된 문서 1번 입니다.
node.js의 배운 내용을 정리했습니다.


HTTP 트랜젝션(요청 응답 메시지) 해부

문서 전체가 아닌 일부분만 정리함.

서버 생성

  • createServer 를 이용해서 웹 서버 객체를 만든다.
const http = require('http');

const server = http.createServer((request, response) => {
	//여기서 작업 진행
});
//request : http 요청
//response : http 응답

//http.createServer([options => 객체 형식],[requestListener => 함수])

  • HTTP 요청마다 createServer에 전달된 함수가 한 번씩 호출.
  • createServer반환한 Server객체는 EventEmitter
    EventEmitter :
    이벤트를 내보내는 객체
    * 리스너(함수 객체)를 실행
const server = http.createServer(); //server 객체를 생성
server.on('request', (request, response) => { //리스너를 추가
  // 여기서 작업이 진행됩니다! (요청 핸들러 함수 호출)
  //.on이 eventemitter
});
  • 요청이 오면, requestresponse 객체를 전달하며 요청 핸들러 함수 호출
  • 요청을 처리하려면 :
    * listen 메서드가 server 객체에서 호출되야함.
    	>`server.listen()` : Starts the HTTP server listening for connections
    * 대부분은 **서버가 사용하려는 포트 번호를  `listen`에 전달**하면 됨. 


메서드 , URL, 헤더

  • 요청을 처리할 때, 우선 메서드와 url을 확인 후, 작업을 실행해야 한다.
  • node에서 request 객체에 이 프로퍼티들을 넣어두었다.
  • 헤더도 request 객체에 들어있다.
    * 헤더는 소문자로만 표현된다 => 헤더 파싱 작업을 더 간편하게 해줌.
const { method, url } = request;
const { headers } = request;
const userAgent = headers['user-agent'];



요청바디

  • POSTPUT 요청을 받을 때
  • 핸들러에 전달된 request 객체는 ReadableStream 인터페이스를 구현하고 있다.
    ReadableStream : 데이터가 읽을만한게 있을 경우의 스트림
    여기에 이벤트 리스너를 등록하거나 다른 스트림에 파이프로 연결할 수 있다.
    스트림 'data''end' 이벤트에 이벤트 리스너를 등록해 데이터를 받을 수 있다.
    'data'에 청크(버퍼 객체 => 여기선 데이터 덩이라고 생각해두자.)가 쌓여
    * 다 쌓인뒤, 'end'이벤트에서 해당 이벤트 발생.
let body = [];
request.on('data', (chunk) => {
  body.push(chunk); //body에 청크가 쌓인다
}).on('end', () => { //다 쌓이면 엔드 이벤트 발생해서
  body = Buffer.concat(body).toString();
  // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
});



오류에 대한 간단한 설명

  • request 스트림의 오류가 발생하면 'error' 이벤트가 발생하면서 오류를 전달.
    * 단순 오류라도 꼭 에러 이벤트 리스너를 추가하자.
request.on('error', (err) => {
  // 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
  console.error(err.stack);
});



위의 내용을 종합

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();
    // 여기서 헤더, 메서드, url, 바디를 가지게 되었고
    // 이 요청에 응답하는 데 필요한 어떤 일이라도 할 수 있게 되었습니다.
  });
}).listen(8080); // 이 서버를 활성화하고 8080 포트로 받습니다.



명시적인 헤더 데이터 전송

  • 직접 응답 스트림에 헤더를 작성할 경우 writeHead 메서드를 사용.
  • 이 메서드는 스트림에 상태 코드와 헤더를 작성 한다.
response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});



응답 바디 전송

  • responseWritableStream이므로 응답 바디는 일반적 스트림 메서드로 작성
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
  • 아니면 위의 코드 마지막에 end함수에 스트림에 보낼 데이터를 전달 가능해서 한 방에 쓰는 것도 된다.
response.end('<html><body><h1>Hello, World!</h1></body></html>');



지금까지의 내용을 사용하면

HTTP 응답 만드는 방법을 배웠으니 이제 모든 것을 함께 사용해 보겠습니다. 이전에 본 예제에서 사용자가 서버에 보낸 모든 데이터를 다시 보내는 서버를 만들 것입니다. JSON.stringify를 사용해서 데이터를 JSON으로 포매팅할 것입니다.

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

    response.statusCode = 200;
    response.setHeader('Content-Type', 'application/json');
    // 주의: 위 두 줄은 다음 한 줄로 대체할 수도 있습니다.
    // response.writeHead(200, {'Content-Type': 'application/json'})

    const responseBody = { headers, method, url, body };

    response.write(JSON.stringify(responseBody));
    response.end();
    // 주의: 위 두 줄은 다음 한 줄로 대체할 수도 있습니다.
    // response.end(JSON.stringify(responseBody))

    // 새로운 부분이 끝났습니다.
  });
}).listen(8080);



조금 더 간단한 형식의 예제는 아래에

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



Written with StackEdit.

0개의 댓글