프론트엔드-코드/Node.js

서버 띄우기 2 url마다 다르게 받기

sdafdq 2023. 10. 12. 14:05
const http = require("http");
const url=require("url");

const hostName = "127.0.0.1";
const port = 3000;


const server = http.createServer((req, res)=>{
  switch(req.method){
    case 'GET' :
      console.log(req.url);
      if(req.url === "/"){
        res.setHeader("Content-Type", "text/plain");
        res.writeHead(200);
        res.end("you send with GET method")
      }else if(req.url.substring(0,5) === '/data'){
       
        const queryParams = url.parse(req.url, true).query;
        res.setHeader("Content-Type", "text/html");
        res.writeHead(200);
        res.write("<html><head><title>Javascript Node.js</title></head><body>");

        for(let key in queryParams){
          res.write(`<h1>${key}</h1>`);
          res.write(`<h2>${queryParams[key]}</h2>`);
        }
        res.end("</body></html>");
      }
      break;
   
    default: res.end();
      break;
  }
});

server.listen(port, hostName, ()=>{
  console.log(`Server running at http://${hostName}:${port}`);
})

서버 생성해 주는데, 

request의 메소드에 따라서

get이면 또 나뉘는데,

/루트면 그냥 메시지 출력

 

만약 url을 앞쪽 5글자만 (/data 가 5글자니까) 떼어서, 그게 /data면

url용 parse 해줘서 쿼리들 parse 해줘서 잘 나눠줌. 

 

참고로, url.parse(req.url) 자체는

Url {
  protocol: null,
  slashes: null,
  auth: null,
  host: null,
  port: null,
  hostname: null,
  hash: null,
  search: '?hello=1&kim=3asd',
  query: 'hello=1&kim=3asd',
  pathname: '/data',
  path: '/data?hello=1&kim=3asd',
  href: '/data?hello=1&kim=3asd'
}

이렇게 url에 따라서 여러 것들로 나눠줌.

.query는 그것들 중 쿼리만 가져온 거.

 

참고로, 그냥

url.parse(req.url).query 하면 hello=1&kim=3asd 이렇게 그대로 문자열로 나옴.

근데 url.parse(req.url, true) 해서 true를 주면 이거는 각 값들을 객체형식으로 만들어 달라 이거임.

그래서 { hello: '1', kim: '3asd' } 이렇게 나옴.

 

여튼 응답의 헤더에 콘텐츠 타입을 text인데 html로 해 주고,

writeHead 이거는 응답코드 쓰는 거같다. 실제로 400으로 해 놨더니 응답이 400으로 왔다. 물론 데이터는 제대로 응답됐고, HTTP 코드만 400으로 나왔다.

 

뭐 여튼 html 태그로 주고 싶어서 헤더의 콘텐츠 타입을 text/html로 했고,

write로 응답에 써 줬다. response.write(값)이 메시지바디에 쓰는 건가 보다.

그리고, 덮어쓰기가 아니고 추가쓰기 인가 보다.

 

res.end(데이터)는 응답 메시지의 바디에 저걸 추가로 써 주면서 보내주는 것 까지 같이 하나 보다.

근데,

 

그냥 res.end() 해도 된다.

 

그냥 응답 준비를 끝냈고 전송한다는 res.end()와 응답 메시지 바디에 쓰는 res.write()를 구분지어 놓는게 훨씬 좋을 것 같다.

 

 

 

'프론트엔드-코드 > Node.js' 카테고리의 다른 글

express + mysql  (0) 2023.11.03
express  (0) 2023.10.30
파일 fs  (0) 2023.10.11
프로젝트 폴더에 파일 생성 -미완  (0) 2023.10.06
프로젝트 폴더에 폴더 생성  (0) 2023.10.06