Node
Node.js를 사용하여 서버 생성하기
citron031
2023. 1. 20. 08:48
nodejs로 간단하게 웹 서버를 만드는 방법을 정리한다.
참고 자료 : https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/node 명령어로 js 파일을 실행하여 서버를 켤 수 있다.
HTTP 트랜잭션 해부 | Node.js
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
nodejs.org
서버 생성
const http = require('http');
const server = http.createServer((req, res) => {
res.write('<p>Hello Worlds!</p>'); // HTML을 반환할 수도 있다.
res.end('<h2>END</h2>');
});
server.listen(3065, () => {
console.log("server start.");
});
// 또는 //
const server = http.createServer();
server.on('request', (request, response) => {
res.write('<p>Hello Worlds!</p>');
res.end('<h2>END</h2>');
});
- 위와 같이 http.createServer를 통해서 웹 서버 객체를 만들 수 있다.
- createServer에 서버에서 일어날 활동을 작성합니다.
- request 객체 내부에는 headers, method, url등이 들어있다.
- method와 url을 보고 각 메소드에 맞는 응답을 할 수 있다.
method와 url
const http = require('http');
const server = http.createServer((req, res) => {
console.log(req.method, req.url);
if(req.method === 'GET') {
if(req.url === '/test/api') {
res.write('GET');
}
} else if(req.method === 'POST') {
if(req.url === '/test/api') {
res.write('POST');
}
} else if(req.method === 'DELETE') {
if(req.url === '/test/api') {
res.write('DELETE');
}
} else if(req.method === 'PUT') {
if(req.url === '/test/api') {
res.write('PUT');
}
}
res.end('end');
});
server.listen(3065, () => {
console.log("server start.");
});
Request body
- POST나 PUT 메소드 request의 body에는 클라이언트에서 전송된 데이터가 들어와 있다.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
});
- 'data'와 'end' 이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.
- 받은 데이터는 body에 저장되며, end에서 데이터를 처리하여 reponse에 담아 보낼 수 있다.
오류
request.on('error', (err) => {
// 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
console.error(err.stack);
});
- 오류가 발생하면, 'error' 이벤트 리스너를 통해서 에러 메세지를 출력하고 에러 상황을 관리한다.
Response 하기
- 응답을 하기위해서 reponse의 상태코드를 지정할 수 있다.
response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.
or
response.statusCode = 200; // 정상 작동
or
response.statusCode = 201; // 새로운 리소스가 생성되었음을 알린다.
🍩 200번대는 성공, 400번대는 요청 오류 (클라이언트 오류) 500번대는 서버 오류이다.
- 또한, setHeader로 헤드를 설정할 수도 있다.
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
- 위의 두 코드를 합한 방법으로 더 간단한 writeHead가 있다.
response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
- 작성한 body의 내용을 response에 담아 보낼 수 있는데, write 나 end를 사용한다.
response.write('Hello' + body);
response.end();
or
response.end("Hello" + body);
- end를 사용한 이후에는 write를 사용할 수 없다.
if (method === 'POST') {
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// body에 문자열로 변환된 request body의 내용이 담겨있다.
response.end(body.toUpperCase());
// 대문자로 변환해서 response에 담아 보낸다.
});
} else {
response.statusCode = 404;
response.end("ERROR Method");
}
- 위와 같이 모든 매소드에 대해서 작동할 수 있도록 코드를 작성해야 한다.
- 어떤 매소드의 request가 올지 모르기 때문이다.
(에러를 방지한다.)