티스토리 뷰

728x90
반응형

응답을 보내는 부분과 서버에 연결하는 부분 추가

이벤트 리스너 사용

//웹서버 켜기
const http = require('http');

//req:요청 res:응답
const server = http.createServer((req, res) => {
  // 여기에 어떻게 응답할 지 적어줍니다.
  res.writeHead(200,{'Content-Type' : 'text/html; charset=utf-8'})
  //콘텐츠 타입  html 텍스트 /한글
  res.write('<h1>Hello Node! hahahahahahaha한글 이승민</h1>');
  res.end('<p>Hello Server!</p>');
})

//서버를 킨다
// .listen(3000, () => {
//   console.log('3000번 포트에서 서버 대기중입니다!');
// });
server.listen(3000)//포트넘버
//이벤트 리스너 방식
server.on('listening',()=>{
  console.log('3000번 포트에서 실행하고있음');
})
server.on('err',(err)=>{
  console.error(err);
})

http://localhost:3000/

내부 아이피 (집 공유기)

 


> index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Node.js 웹 서버</title>
</head>
<body>
    <h1>Node.js 웹 서버</h1>
    <p>만들 준비되셨나요?</p>
</body>
</html>

> httphtml.js

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

const server = http.createServer(async (req, res) => {
 const data = await fs.readFile('./index.html')
 res.writeHead(200,{'Content-Type' : 'text/html; charset=utf-8'})
 res.end(data)
})

server.listen(3000)

server.on('listening',()=>{
  console.log('3000번 포트에서 서버 대기중입니다!');
})

[에러 핸들링(예외처리)]

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

const server = http.createServer(async (req, res) => {
  try{
    throw new Error('에러메시지 : 표시할 수 없는 화면입니다.')
 const data = await fs.readFile('./index.html')
 res.writeHead(200,{'Content-Type' : 'text/html; charset=utf-8'})
 res.end(data)
  } catch(err){
    console.error(err);
    res.writeHead(500,{'Content-Type' : 'text/html; charset=utf-8'})
    //500응답코드
    res.end(`<p>${err.message}</p>`)
  }
})

server.listen(3000)

server.on('listening',()=>{
  console.log('3000번 포트에서 서버 대기중입니다!');
})

[REST란?]

자기 할 만만 하고 끊는 통신(HTTP) 방식   < 클라이언트(모바일,웹,다른서버)↔node.js 서버 >

요청 메서드 GET , POST , PUT , PATCH , DELETE , OPTIONS

*GET : 가져오기

*POST : 데이터를 쓰고 그것을 서버에 보낼 때

PUT(다변경) , *PATCH(일부분) : db에 저장된 정보 수정

*DELETE : 서버의 자원 삭제(회원 탈퇴)

OPTIONS : 요청하기 전에 통신 옵션을 설명


async 사용

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

const users = {};

//#req 클라이언트의 요청 들어옴# #res 서버가 클라이언트한테 반환할 것 #
const server = http.createServer(async (req, res) => {

  
  try{
    if(req.method === 'GET'){
      if(req.url ==='/'){
          const data = await fs.readFile('./restFront.html')//then의 파라미터값. await에 담긴다
          res.writeHead(200,{'Content-Type': 'text/html; charset=utf-8'})
          return res.end(data)// 리턴을 해야 분기처리가 끝난다
      } else if (req.url === '/about'){
          const data = await fs.readFile('./about.html')//then의 파라미터값. await에 담긴다
           res.writeHead(200,{'Content-Type': 'text/html; charset=utf-8'})
           return res.end(data)// 리턴을 해야 분기처리가 끝난다
      } else if (req.url ==='/users'){
        res.writeHead(200,{'Content-Type': 'application/json; charset=utf-8'})
        return res.end(JSON.stringify(users))
      }

      try{
        const data = await fs.readFile(`./${req.url}`)
        return res.end(data)
      }catch(err){
        console.error(err);
      }
    }
    else if (req.method === 'POST'){
      if(req.url === '/users'){
        let body = ''

        req.on('data',(data)=>{
          body += data 
        })
        return req.on('end',()=>{
          console.log('POST body:', body)
          const { name } = JSON.parse(body)
          const id = Date.now() //1245463453
          users[id] = name;
          console.log(users);
          res.writeHead(201,{'Content-Type': 'text/plain; charset=utf-8'})
          res.end('OK')
        })
      }
    } else if (req.method ==='PUT'){
      if(req.url.startsWith('/users/')){
        const key = req.url.split('/')[2]
        // console.log(key);
        let body = ''
        req.on('data',(data)=>{
          body += data
        })
        return req.on('end',()=>{
          console.log('put본문:',body);
          users[key]= JSON.parse(body).name
          res.writeHead(200,{'Content-Tyepe': 'text/plain; charset=utf-8'})
          res.end('ok')
        })
      }
    } else if (req.method === 'DELETE'){
      console.log(req.url);
      if(req.url.startsWith('/users/')){
        const key = req.url.split('/')[2]
        delete users[key]
        //res.writeHead(200,{'Content=Type': 'text/plain; charset=utf-8'})
        return res.end('ok')
      }
    }

  }catch(err){
    console.error(err);
    res.writeHead(500,{'Content-Type': 'text/plain; charset = utf-8'})
    res.end(err.message)
  }
})
server.listen(3002)

server.on('listening',()=>{
  console.log('3002번 포트에서 서버 대기중입니다!');
})
server.on('err',()=>{
  console.error(err);
})

 


[cookie /session]

//cokie

const http = require('http')

const server = http.createServer((req,res)=>{
  console.log(req.url,res.headersSent.cookie);
  res.writeHead(200,{'Set-Cookie': 'mycookie=test'})
  res.end('hello cookie')
})
server.listen(3000)
server.on('listening',()=>{
  console.log('3000포트연결');
})
server.on('error',(err)=>{
  console.error(err);
})
//cokie

const http = require('http')
const fs =require('fs')
const url = require('url')
const qs = require('querystring')

const parseCookie =(cookie = '')=>cookie//쿠키를 배열로 분해해서 쓰려고
  .split(';')
  .map(v=>v.split('='))
  .reduce((acc,[k,v])=> {
    acc[k.trim()]=decodeURIComponent(v) // trim 공백을 지운다 . v를 디코드한다
    return acc
  },{})

const server = http.createServer(async(req,res)=>{
  //const cookie =req.headers.cookie   //출력 : mycookie=test; name=lsm
  const cookie = parseCookie(req.headers.cookie) //출력: [ 'mycookie', 'test', name: 'lsm' ]
  console.log(cookie);
  const {name}=cookie //구조분해할당

  const expires = new Date() //시간을 설정할거야
  expires.setMinutes(expires.getMinutes()+1)//분 설정할거야:: 현재시간ㅂ터 +1분까지

  res.writeHead(302,{Location : '/','Set-Cookie': `name=${encodeURIComponent(name)}; Expires=${expires.toGMTString()}; httpOnly; path=/`})
  //옵션 추가 .location
  //res.end(`success${name}`) // server에 보낸다 웹에 글자 써진다.
  res.end()
})

server.listen(3000)
server.on('listening',()=>{
  console.log('3000포트연결');
})
server.on('error',(err)=>{
  console.error(err);
})

session : 개인정보 쿠키에 노출 안되게

서버는 알고, 클라이언트에서는 안 보이고.


보통 이렇게 사용 안 함. 보안에 취약하고 정보 날아갈 수 있다. DB 필요하다

728x90
반응형
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함
반응형