Node.js_HTTP 모듈로 서버 만들기
Node.js 2021. 7. 1. 19:05(본 포스팅은 길벗의 'Node.js 교과서' 책을 공부하면서 작성되었습니다_내돈내산)
1. HTTP 서버 만들기
- 서버와 클라이언트의 관계
- 클라이언트가 서버로 요청(request)을 보냄(req)
- 서버는 요청을 처리
- 처리 후 클라이언트로 응답(response)을 보냄(res)
const http = require('http');
----------------------------------------------------------------------------------------------------
const server = http.createServer((req, res) => {
// 클라이언트가 서버로 요청을 보냈을때 어떻게 응답할지 적는 곳
// 브라우저에 지금 보내고 있는 내용의 형식을 알려줌
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.write('<h1>Hello Node!</h1>');
res.end('<p>Hello Server!</p>');
})
.listen(8080); // 서버 연결, 프로세스에 올려준다
----------------------------------------------------------------------------------------------------
// fs를 이용해 HTML 파일을 바로 읽어올경우의 구현법
const fs = require('fs').promises;
http.createServer(async (req, res) => {
try {
const data = await fs.readFile('./server2.html');
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end(data);
} catch (err) {
console.error(err);
// text/plain >> 일반 문자열
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(err.message);
}
})
----------------------------------------------------------------------------------------------------
server.on('listening', () => {
console.log('8080번 포트에서 서버 대기 중입니다!');
}); // 이벤트 리스너 붙이기
server.on('error', (error) => {
console.error(error);
});
2. REST(Representational State Transfer) API 서버 만들기
- 서버에 요청을 보낼때는 주소를 통해 요청의 내용을 표현한다.
- 서버의 자원을 정의하고 자원의 주소를 지정하는 방법
- HTTP 요청 메서드
- GET: 서버 자원을 가져오려고 할 떄 사용
- POST: 서버에 자원을 새로 등록하고자 할때 사용(또는 뭘 써야할지 애매할 때)
- PUT: 서버의 자원을 요청에 들어있는 자원으로 치환하고자 할 때 사용
- PATCH: 서버 자원의 일부만 수정하고자 할 때 사용
- DELETE: 서버의 자원을 삭제하고자 할 때 사용 - RESTful 서버: REST API 를 사용한 주소체계를 이용하는 서버
- header: data들의 data // 메타데이터
// 기본적인 RESTful server
const http = require('http');
const fs = require('fs').promises;
const users = {}; // 데이터 저장용
http.createServer(async (req, res) => {
try {
if (req.method === 'GET') {
if (req.url === '/') {
const data = await fs.readFile('./restFront.html');
// header에 쓰기
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');
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));
}
// /도 /about도 /users도 아니면
try {
const data = await fs.readFile(`.${req.url}`);
return res.end(data);
} catch (err) {
// 주소에 해당하는 라우트를 못 찾았다는 404 Not Found error 발생
}
} else 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('ok');
});
}
} else 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('ok');
});
}
} else 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('ok');
}
}
res.writeHead(404);
return res.end('NOT FOUND');
} catch (err) {
console.error(err);
res.writeHead(500, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end(err.message);
}
})
.listen(8082, () => {
console.log('8082번 포트에서 서버 대기 중입니다');
});
'Node.js' 카테고리의 다른 글
Node.js_클러스터(Cluster) (0) | 2021.07.02 |
---|---|
Node.js_쿠키와 세션 (0) | 2021.07.02 |
Node.js_버퍼(buffer)와 스트림(stream) (0) | 2021.07.01 |
Node.js_파일 시스템(fs) (0) | 2021.07.01 |
Node.js_워커스레드(worker thread) (0) | 2021.07.01 |