HTTP 트랜젝션 문서를 개인적인 학습목적으로 정리함.
원문: https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/
서버 만들고 포트에 연결
const http = require('http');
const server = http.createServer((request, response) => {
// 여기서 작업이 진행됩니다!
});
server.listen(PORT, ip, () => {
//
})
request 객체에는 유용한 프로퍼티들이 있다
그렇다면 request.body도 있을까? ⇒ x
buffer/ stream이란? 데이터를 전달할때 버퍼형식으로 전달하고 효율을 위해 잘게 쪼개는데 그 방식이 스트림이다
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
})
//여기서 chunk는 데이터를 잘게 쪼갠 단위이다
//데이터를 스트림으로 받아와서 배열에 푸시한 다음
//Buffer.concat으로 다시 하나의 요소로 합쳐서 읽을수 있게 toString()했다
//이렇게 코드를 쓰지 않고 더 간단한 방법이 있는 것 같다
//어떤 일이 일어나는지 이해하기 위한 코드인듯
오류에 대한 이벤트리스너도 등록해야 한다(에러 핸들링)
request.on('error', (err) => {
//오류가 발생하면 error 이벤트 발생하고
//여기에서 처리 코드 써넣어야
console.err(error)
})
상태코드 설정 → 헤더 설정 → 바디 전송
상태코드 설정
reponse.statusCode = 404
//숫자는 http 상태코드
//기본값은 200(성공응답)
응답헤더 설정< response.setHeader() 방식 >
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
//'Content-Type' : 응답으로 반환된 컨텐츠의 데이터타입 설정
//텍스트 : "text/html; charset=utf-8"
//JSON 객체 : "application/json"
//다른 것들엔 뭐가 있을까?
헤더 유형 ( " Content-Type " )
더 명시적인 방식으로 헤더 설정도 가능하다< response.writeHead() >
암묵적인 헤더? 명시적인 헤더?
response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
//첫번째 인자에 상태코드
응답 바디 전송< response.write() >
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
//요청 전송이 끝날 때 response.end()
//response.end('<html><body><h1>Hello, World!</h1></body></html>');로도 작성 가능
응답도 에러핸들링 해줘야 한다
클라이언트가 보낸 요청을 그대로 응답하는 서버
const http = require('http');
http.createServer((request, response) => {
const { headers, method, url } = request;
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
response.on('error', (err) => {
console.error(err);
});
//응답의 에러는 end 이벤트의 콜백 안에서 처리하는구나
response.statusCode = 200;
response.setHeader('Content-Type', 'application/json');
// response.writeHead(200, {'Content-Type': 'application/json'})
//headers, method, url, 'body' 프로퍼티가 있는 객체를 할당
const responseBody = { headers, method, url, body };
//JSON 객체로 변환해서 응답 body 전송
response.write(JSON.stringify(responseBody));
response.end();
// response.end(JSON.stringify(responseBody)) 도 가능
});
}).listen(8080);
위 서버에 조건 추가
const http = require('http');
http.createServer((request, response) => {
if (request.method === 'POST' && request.url === '/echo') {
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
response.end(body);
});
} else {
response.statusCode = 404;
response.end();
}
}).listen(8080);
//간단한 조건문으로 메소드와 URL에 따라 다른 응답을 할 수 있다
//조건에 맞으면('POST', /echo) 요청을 그대로 응답
//조건에 맞지 않으면 클라이언트 에러
//URL에 따른 분기: 라우팅
//express 프레임워크로 라우팅하는 방법도 학습
const http = require('http');
http.createServer((request, response) => {
if (request.method === 'POST' && request.url === '/echo') {
request.pipe(response);
} else {
response.statusCode = 404;
response.end();
}
}).listen(8080);
//객체(여기서는 request 객체) .pipe (객체, 여기서는 response 객체)
stderr(Standard error) / stdout(Standard output)에 오류 로깅
stdout?
stderr?
에러 문서 : https://nodejs.org/api/errors.html
const http = require('http');
http.createServer((request, response) => {
request.on('error', (err) => {
console.error(err);
//이 부분이 중요한 듯, 요청에 오류가 있을 때 오류코드 '응답'
response.statusCode = 400;
response.end();
});
//응답에 오류가 있을 때 그 에러 콘솔에 표시
response.on('error', (err) => {
console.error(err);
});
if (request.method === 'POST' && request.url === '/echo') {
request.pipe(response);
} else {
//조건이 맞지 않을 때 오류코드 설정하고 응답(라우팅)
response.statusCode = 404;
response.end();
}
}).listen(8080);
문서를 읽었으면 다음 질문에 답할 수 있어야 한다