Node js

»

Node.js

서버 생성

createServer로 웹서버 객체를 만듭니다

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

이 서버로 오는 HTTP 요청마다 createServer에 전달된 함수가 한번씩 호출됩니다

메소드, URL, 헤더

요청을 처리할때 메소드와 URL을 확인한 후 이와 관련된 적절한 작업을 실행하려고 할 것입니다

reqest 객체에 유용한 프로퍼티가 있습니다

const { method, url } = request;

여기서 method는 항상 일반적인 HTTP 메소드가 될것입니다

url은 전체 URL에서 서버, 프로토콜, 포트를 제외한 것으로 세번째 슬래시 이후의 나머지 전부라고 볼수있습니다

헤더 또한 reqest에 headers라는 전용 객체가 있습니다

const { headers } = request;
const userAgent = headers["user-agent"];

클라이언트가 어떻게 헤더를 설정했는지에 관계없이 모든 헤더는 소문자로만 표현된다는 것을 기억해야 합니다

이는 헤더를 파싱하는 작업을 간편하게 해줍니다

요청 바디

POST나 PUT 요청을 받을때 애플리케이션에 요청 바디는 중요합니다

요청 헤더에 접근하는 것보다 바디 데이터를 받는것은 좀 더 어렵습니다

let body = [];
request
  .on("data", (chunk) => {
    body.push(chunk);
  })
  .on("end", () => {
    body = Buffer.concat(body).toString();
    // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
  });

오류에 대한 간단한 설명

요청 스트림에 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 포트로 받습니다.

HTTP 상태 코드

기본값은 200입니다

상태 코드를 변경하려면 statusCode 프로퍼티를 설정하면 됩니다

response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.

명시적인 헤더 데이터 전송

지금까지 헤더와 상태코드 메소드는 암묵적인 헤더를 사용하고 있었지만 직접 바꿀수도 있습니다

response.writeHead(200, {
  "Content-Type": "application/json",
  "X-Powered-By": "bacon",
});

응답 바디 전송

클라이언트로 보내는 응답 바디는 일반적으로 스트림 메서드를 사용해서 작성합니다

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

사용자가 서버에 보낸 모든 데이터를 다시 보내는 서버

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

참조

[HTTP 트랜잭션 해부 Node.js](https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/)