2021년 8월 5일에 작성된 문서 1번 입니다.
node.js의 배운 내용을 정리했습니다.
createServer
를 이용해서 웹 서버 객체를 만든다.const http = require('http');
const server = http.createServer((request, response) => {
//여기서 작업 진행
});
//request : http 요청
//response : http 응답
//http.createServer([options => 객체 형식],[requestListener => 함수])
createServer
에 전달된 함수가 한 번씩 호출. createServer
가 반환한 Server
객체는 EventEmitter
EventEmitter
:const server = http.createServer(); //server 객체를 생성
server.on('request', (request, response) => { //리스너를 추가
// 여기서 작업이 진행됩니다! (요청 핸들러 함수 호출)
//.on이 eventemitter
});
request
와 response
객체를 전달하며 요청 핸들러 함수 호출listen
메서드가 server
객체에서 호출되야함. >`server.listen()` : Starts the HTTP server listening for connections
* 대부분은 **서버가 사용하려는 포트 번호를 `listen`에 전달**하면 됨.
request
객체에 이 프로퍼티들을 넣어두었다.request
객체에 들어있다.const { method, url } = request;
const { headers } = request;
const userAgent = headers['user-agent'];
POST
나 PUT
요청을 받을 때request
객체는 ReadableStream
인터페이스를 구현하고 있다.ReadableStream
: 데이터가 읽을만한게 있을 경우의 스트림'data'
와 'end'
이벤트에 이벤트 리스너를 등록해 데이터를 받을 수 있다.'data'
에 청크(버퍼 객체 => 여기선 데이터 덩이라고 생각해두자.)가 쌓여'end'
이벤트에서 해당 이벤트 발생.let body = [];
request.on('data', (chunk) => {
body.push(chunk); //body에 청크가 쌓인다
}).on('end', () => { //다 쌓이면 엔드 이벤트 발생해서
body = Buffer.concat(body).toString();
// 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
});
request
스트림의 오류가 발생하면 'error'
이벤트가 발생하면서 오류를 전달.request.on('error', (err) => {
// 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
console.error(err.stack);
});
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();
// 여기서 헤더, 메서드, url, 바디를 가지게 되었고
// 이 요청에 응답하는 데 필요한 어떤 일이라도 할 수 있게 되었습니다.
});
}).listen(8080); // 이 서버를 활성화하고 8080 포트로 받습니다.
writeHead
메서드를 사용. response.writeHead(200, {
'Content-Type': 'application/json',
'X-Powered-By': 'bacon'
});
response
는 WritableStream
이므로 응답 바디는 일반적 스트림 메서드로 작성response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();
end
함수에 스트림에 보낼 데이터를 전달 가능해서 한 방에 쓰는 것도 된다.response.end('<html><body><h1>Hello, World!</h1></body></html>');
HTTP 응답 만드는 방법을 배웠으니 이제 모든 것을 함께 사용해 보겠습니다. 이전에 본 예제에서 사용자가 서버에 보낸 모든 데이터를 다시 보내는 서버를 만들 것입니다.
JSON.stringify
를 사용해서 데이터를 JSON으로 포매팅할 것입니다.
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.statusCode = 200;
response.setHeader('Content-Type', 'application/json');
// 주의: 위 두 줄은 다음 한 줄로 대체할 수도 있습니다.
// response.writeHead(200, {'Content-Type': 'application/json'})
const responseBody = { headers, method, url, 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') {
request.pipe(response);
} else {
response.statusCode = 404;
response.end();
}
}).listen(8080);
Written with StackEdit.