이 서버로 오는 HTTP 요청마다 createServer
에 전달된 함수가 한 번씩 호출된다.
createServer
가 반환한 server
객체는 EventEmitter
이다.
HTTP 요청이 서버에 오면 트랜잭션을 다루기 위해 request
와 response
객체를 전달하며 요청 핸들러 함수를 호출한다.
요청을 처리하려면 listen
메서드가 server
객체에서 호출되어야 한다. 대부분은 서버가 사용하고자 하는 포트 번호를 listen
에 전달하기만 하면 된다.
// 축약 문법
// http 모듈 불러오기
const http = require('http');
// 웹 서버 객체 생성
// createServer 사용
const server = http.createServer((request, response) => {
// 여기서 작업이 진행됩니다!
})
const server = http.createServer();
server.on('request', (request, response) => {
// 여기서 작업이 진행됩니다!
});
cf.
EventEmitter
는 인스턴스를 생성하는 클래스이다. 이 객체는 한 개 이상의 함수를 특정 event에 붙여서 실행할 수 있게하는 .on() 함수를 가지고 있다. 이 객체가 이벤트를 실행(emit)하면 특정 event에 붙어있는 한 개 이상의 함수를 모두 비동기적으로 호출한다. 호출된 함수로 인해 발생한 리턴 값은 모두 무시된다.
(https://url.kr/krvul3)
핸들러에 전달된 request
객체는 ReadableStream
인터페이스를 구현하고 있다.
이 스트림에 이벤트 리스너를 등록하거나 다른 스트림에 파이프로 연결할 수 있다.
스트림의 data
와 end
이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있다.
각 data
이벤트에서 발생시킨 chunk는 Buffer
이다.
chunk가 문자열 데이터임을 알고 있다면 데이터를 배열에 수집하여 end
이벤트에서 이어 붙여 문자열로 만드는 것이 가장 좋다.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
// 이곳에 `body`의 전체 요청 바디가 문자열로 담김
});
request
스트림의 오류가 발생하면 스트림에서 error
이벤트가 발생하면서 오류를 전달한다.
request.on('error', (err) => {
// 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
console.error(err.stack);
});
상태 코드는 따로 설정하지 않는 이상 항상 200이다.
상태 코드를 변경하려면 statusCode
프로퍼티를 설정하면 된다.
response.status = 404
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'
});
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>');
response
스트림도 error
이벤트를 발생시킬 수 있다. 따라서 request
스트림 오류 처리와 동일하게 처리한다.