http protocol을 통해 통신해서 API를 제공하는 주체
→ GET/POST 요청에서 url에 따라, 클라이언트의 요청에 따라 routing하고, 그 요청에 따라 서버는 필요한 데이터를 불러온다.
Node.js transaction에 대한 자세한 설명 살펴보기
createServer
를 이용한다. const http = require('http');
const server = http.createServer((req, res) => {
// 이곳에서 작업이 진행된다.
});
createServer
에 전달된 함수가 한 번씩 호출된다. request
객체를 통해 적절한 작업을 실행한다.method: 일반적인 http 메서드
const { method, url } = request;
request
에 header
라는 적용 객체가 있다. const { headers } = request;
const userAgent = headers['user-agent'];
클라이언트가 어떻게 헤더를 설정했는지에 관계없이 모든 헤더는 소문자로만 표현된다는 것을 기억해야 한다. 이는 어떤 목적이든 헤더를 파싱하는 작업을 간편하게 해준다.
request
객체는 ReadableStram
인터페이스를 구현한다. let data = '';
req.on('data', chunk => {
data = data + chunk;
});
req.on('end', () => {
data = data.toLowerCase();
res.writeHead(201, headers);
res.end(data);
});
data
와 end
이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.data
이벤트에서 발생시킨 chunk는 Buffer이다.end
이벤트에 이어 붙일 다음 문자열로 만드는 것이 가장 좋다. const http = require('http');
http.createServer((req, res) => {
const { headers, method, url } = req;
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 포트로 받는다.
response
객체는 serverResponse
의 인스턴스이다.setHeader
메서드로 헤더를 설정한다. response.setHeader('Content-type', 'application/json');
statusCode
, setHeader
는 바디 데이터를 보내기 전 적절한 순간에 헤더를 보내는 일을 노드에 의존하고 있다. writeHead
메서드를 통해 명시적으로 응답 스트림에 헤더를 작성할 수 있다.writeHead
메서드는 스트림에 상태코드와 헤더를 작성한다. response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
response
객체는 writableStream
이므로 클라이언트로 보내는 응답바디는 일반적인 스트림 메서드를 사용해서 작성한다. end
함수에 스트림에 보낼 데이터의 마지막 비트를 선택적으로 전달할 수 있다. response.end('<html><body><h1>Hello, World!</h1></body></html>');
❗️ 바디에 데이터청크를 작성하기 전에 상태 코드와 헤더를 설정해야 한다.
// 클라이언트가 서버에 보낸 모든 데이터를 다시 보내는 서버
// JSON.stringify 를 이용해 데이터를 JSON 방식으로 formating한다.
http.createServer((req, res) => {
const { headers, method, url } = req;
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
res.on('error', (err) => {
console.error(err);
});
res.statusCode = 200;
res.setHeader('Content-type', 'application/json');
// 위 줄은 다음과 같이 대체할 수 있다.
// res.writeHead(200, {'Content-Type': 'application/json'})
const responseBody = { header, method, url, body };
res.write(JSON.stringify(resonseBoby));
res.end();
// 위 줄은 다음과 같이 대체할 수 있다.
// response.end(JSON.stringify(resonseBody));
});
}).listn(8080);