Node.js - http 모듈로 서버 만들기 (08/10)

최정석·2023년 8월 10일
0
post-thumbnail

서버와 클라이언트

  • 클라이언트가 서버로 요청(request)을 보냄
  • 서버는 요청을 처리
  • 처리 후 클라이언트로 응답(reponse)을 보냄

노드로 http 서버 만들기

const http = require('http')

const server = http.createServer((req, res)=>{
  res.write('<h1>Hello Node</h1>')
  res.write('<p>Hello server</p>')
  res.end('<p>Hello JeongSeok</p>')
})
  .listen(8080);

server.on('listening', ()=>{
  console.log('8080번 포트에서 서버 대기 중.')
})
server.on('error', (error)=>{
  console.error(error)
})

localhost와 포트

  • localhost는 외부에서 접근 불가능, 컴퓨터 내부 주소
  • 포트는 서버 내에서 프로세스를 구분하는 번호
  • 기본적으로 http 서버는 80번 포트 사용(https는 443, 생략가능)

fs로 HTML 읽어오기

const http = require('http')
const fs = require('fs').promises

const server = http.createServer(async (req, res)=>{
  try {
    res.writeHead(200,{'Content-Type': 'text/html; charset=utf-8'}) // 브라우저가 html인지 모를때
    const data = await fs.readFile('./practice.html')
    res.end(data)
  } catch (err) {
    console.error(err)
    res.writeHead(200,{'Content-Type': 'text/plain; charset=utf-8'})
    res.end(err.message)
  }
})

  .listen(8080);

server.on('listening', ()=>{
  console.log('8080번 포트에서 서버 대기 중.')
})
server.on('error', (error)=>{
  console.error(error)
})

HTTP 요청 메서드

  • GET: 서버 자원을 가져오려고 할 때 사용
  • POST: 서버에 자원을 새로 등록하고자 할 때 사용
  • PUT: 서버의 자원을 요청에 들어있는 자원으로 치환할 때 사용
  • PATCH: 서버 자원의 일부만 수정하고자 할 때 사용
  • DELETE: 서버의 자원을 삭제하고자 할 때 사용

GET 요청에 대한 응답

if(req.method === 'GET') {
  // 페이지 url 요청 html 파일 응답하기
      if (req.url === '/') {
        res.writeHead(200, {'Content-Type': 'text/html; charset=utf-8'});
        const data = await fs.readFile('./restFront.html');
        return res.end(data)
      }
// 목록에 대한 데이터 요청
	if (req.url === '/users') {
  		res.writeHead(200, {'Content-Type': 'application/json; charset=utf-8'});
        return res.end(JSON.stringify(users));
      }

POST 요청에 대한 응답

if (req.method === 'POST') {
      if (req.url === '/user') {
        let body = '';
        // 요청의 body를 stream 형식으로 받음
        req.on('data', (data) => {
          body += data;
        });
        // 요청의 body를 다 받은 후 실행됨
        return req.on('end', () => {
          console.log('POST 본문(Body):', body);
          const { name } = JSON.parse(body);
          const id = Date.now();
          users[id] = name;
          res.writeHead(201, { 'Content-Type': 'text/plain; charset=utf-8' });
          res.end('등록 성공');
        });
      }

PUT 요청에 대한 응답

if (req.method === 'PUT') {
      if (req.url.startsWith('/user/')) {
        const key = req.url.split('/')[2];
        let body = '';
        req.on('data', (data) => {
          body += data;
        });
        return req.on('end', () => {
          console.log('PUT 본문(Body):', body);
          users[key] = JSON.parse(body).name;
          res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
          return res.end(JSON.stringify(users));
        });
      }
    }

DELETE 요청에 대한 응답

 if (req.method === 'DELETE') {
      if (req.url.startsWith('/user/')) {
        const key = req.url.split('/')[2];
        delete users[key];
        res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
        return res.end(JSON.stringify(users));
      }
    }

0개의 댓글