Node.js에서 http 모듈은 웹 서버를 구동하기 위한 기본적인 웹 모듈이다.
http 모듈을 사용해 웹 서버 구축하는 과정을 공부해보았다.
아래 내용은 HTTP 요청/응답 처리 과정이 자세하게 설명되어 있는 node.js의 HTTP 트랜잭션 해부 공식 문서를 정리한 내용이다.
우선 모듈을 사용하기 위해서 http 모듈을 require
로 불러와야한다.
const http = require('http');
서버 생성을 위해 createServer()
와 listen()
메서드가 필요하다.
const server = http.createServer((req,res) => {
//요청과 응답 처리는 여기서
})
//3000포트에 서버 활성화
server.listen(3000, () => {
console.log('`http server listen on 3000`)
})
Http 요청이 서버에 오면 node가 트랜잭션을 다루기 위해 request와 response 객체를 전달해 요청 핸들러 함수를 호출한다.
request에는 요청한 정보가 response에는 요청에 대한 응답 내용이 담긴다.
클라이언트가 서버로 요청할 때 보낸 method, url, header, body의 정보가 담겨있어 필요한 정보를 뽑아서 처리할 수 있다.
const server = http.createServer((req,res) => {
//요청 메서드, url, 헤더를 가져온다.
{method, url, headers} = req;
})
body에 담긴 데이터는 streamBuffer 형태로 들어오기 때문에 chunk
파라메터로 받아 문자열로 바꾸는 작업이 필요하다.
let body = []
const server = http.createServer((req,res) => {
req.on('data', (chunk) => {
//chunk는 Buffer 형태 데이터이다.
body.push(chunk)
}).on('end', () => {
//문자열로 변환
body = Buffer.concat(body).toString()
})
})
응답 상태 코드나 헤더 설정을 해줄 수 있고, 응답 데이터를 보낼 수 있다.
response.statusCode(상태코드) : 상태코드 설정
response.setHeader('Content-Type', 'application/json')
: 응답 헤더 설정
response.writeHead(상태코드, 헤더)
: 상태코드와 헤더를 같이 설정
response.end(보낼 데이터)
: 보낼 데이터를 body에 담아 전달
end 메서드를 쓰기전 상태코드와 헤더가 설정되어 있어야한다.
대문자 문자열 소문자로 만드는 POST 요청을 받을 때 요청에 맞는 응답을 하는 서버를 작성해보자.
const http = require('http');
//서버 생성
const server = http.createServer((req,res) => {
//POST 요청 && /lower 일때
if(req.method === 'POST' && req.url === '/lower') {
let body = []
req.on('data', chunk => {
body.push(chunk)
}).on('end', () => {
//buffer 데이터를 문자열화
body = Buffer.concat(body).toString()
//상태코드와 응답헤더를 설정한다.
res.writeHead(200, defaultCorsHeader)
//요청 데이터를 소문자로 변환해서 응답 body에 담아 보낸다.
res.end(body.toLowercase())
})
}
})
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};