반응형
이 글의 동영상 강의 1편입니다.
다음은 동영상 강의 2편입니다.
이 글은 NodeJS 공식 홈페이지의 다음 글을 참고하여 작성하였습니다.
https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/
NodeJS로 서버를 개발하려고 하려면 HTTP의 처리 과정을 이해하여야 합니다.
NodeJS에서 제공하는 http 모듈의 사용법과 같이 배워보도록 하겠습니다.
웹서버 만들기
- 우선 웹서버 객체를 만듭니다.
const http = require('http');
const server = http.createServer((request, response) => {
});
- 이때 사용된 createServer는 server 객체를 생성하고 발생한 이벤트를 전달하는 역할을 하므로 다음과 같이 변경할 수 있습니다.
const server = http.createServer();
server.listen(8080);
server.on('listening', () => {
console.log(`listen on 8080 !!!`);
});
Request 처리하기
- 생성한 서버에서 request를 받아 처리할 수 있습니다.
server.on('request', (request, response) => {
console.log(request.headers);
response.write('<h1>Node Server</h1>');
response.end();
});
- request에는 url, method, header 등의 정보가 포함됩니다.
server.on('request', (request, response) => {
const { headers, method, url } = request;
const userAgent = headers['user-agent'];
console.log(`method : ${method}`);
console.log(`url : ${url }`);
console.log(`userAgent : ${userAgent}`);
response.write('<h1>Node Server</h1>');
response.end();
});
- post나 put의 request에서 stream으로 전달되는 data와 end를 이용하면 body를 읽어올 수 있습니다.
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
console.log(body);
response.write('<h1>Node Server</h1>');
response.end();
});
- 테스트를 위해서 postman에서 다음과 같이 변경 합니다.
- request method를 GET에서 POST로 바꿉니다.
- headers에 다음 값을 추가합니다.
- Content-Type: application/json
- Body탭에서 다음 항목을 변경합니다.
- body type을 none에서 raw로 변경합니다.
- data type을 JSON으로 변경합니다.
- Send를 클릭하면 다음과 같은 결과를 확인할 수 있습니다.
- request에서 error 이벤트를 받아 오류를 처리할 수 있습니다.
request.on('error', (err) => {
// 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
console.error(err.stack);
});
Response 사용하기
- statusCode를 이용해 상태 코드를 전달할 수 있습니다.
지정하지 않을 경우의 상태코드는 항상 200입니다.
response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.
- setHeader를 이용해 header를 설정할 수 있습니다.
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
- 아래와 같이 명시적으로 header를 정의 할 수 있습니다.
response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
- write와 end를 이용해 response body를 만들 수 있습니다.
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
// 또는
response.end('<html><body><h1>Hello, World!</h1></body></html>');
- respone에서 error event는 다음과 같이 처리할 수 있습니다.
response.on('error', (err) => {
console.error(err);
});
- 지금 까지의 내용을 정리하면 다음과 같이 코드를 작성할 수 있습니다.
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);
});
response.writeHead(200, {'Content-Type': 'application/json'})
const responseBody = { headers, method, url, body };
response.end(JSON.stringify(responseBody))
});
}).listen(8080);
에코 서버 만들기
- 다음과 같이 /echo로 요청하는 post 메소드에 대해서 응답하는 서버를 만들 수 있습니다.
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);
이상으로 nodejs의 http 요청을 처리하는 기본적인 방법에 대해 알아보았습니다.
반응형
'Nodejs 기초 동영상강좌' 카테고리의 다른 글
NodeJS기초-12.Express 서버에 스케줄러 만들기 (0) | 2022.01.01 |
---|---|
NodeJS기초-11.Express 라우팅 분리하기 (0) | 2021.12.08 |
NodeJS기초-10.Express 서버 만들기2-미들웨어 (0) | 2021.12.04 |
NodeJS기초-09.Express 서버 만들기1-특징과설치 (0) | 2021.12.03 |
NodeJS기초-07.NodeJS 서버 테스트를 위한 Postman 설치 및 테스트 (0) | 2021.11.29 |
NodeJS기초-06.NodeJS + MySQL 연동하기 (0) | 2021.11.28 |
NodeJS기초-05.NodeJS 버전을 쉽게 변경하는 법 - NVM (0) | 2021.11.27 |
NodeJS기초-04.NodeJS module과 require 사용법 (0) | 2021.11.22 |