본문 바로가기

Node.js/[Node.js]

[Node.js] 서버 만들기 & fs모듈을 promise 형식으로 활용

클라이언트에서 서버로 요청(request)을 보내고, 서버에서는 요청의 처리한 뒤 클라이언트에 응답(response)을 보낸다.

 

따라서 서버에는 요청을 받는 부분응답을 보내는 부분이 있어야 한다.

요청과 응답은 이벤트 방식이라고 생각하면 된다.

클라이언트로부터 요청이 왔을때 어떤 작업을 수행할지 이벤트 리스너를 미리 등록해두어야 한다.

 

const http = require('http');

const server = http.createServer((req, res) => {
	res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
	res.write('<h1>Hello Node!</h1>');
	res.write('<p>Hello server</p>');
	res.end('<p>Hello Seokjun</p>');
})
	.listen(3000);

server.on('listening', () => {
	console.log('3000번 포트에서 서버 대기중');
});
server.on('error', (error) => {
	console.error(error);
});

 

http모듈에는 createServer 메소드가 있다. 인수로 요청에 대한 콜백 함수를 넣을 수 있으며, 요청이 들어올 때 마다 매번 콜백 함수가 실행된다. 따라서 이 콜백 함수에 요청에 대한 응답을 적으면 된다.

 

res 객체에는 res.writeHead, res.write, res.end 메소드가 있다.

  • res.writeHead 는 응답에 대한 정보를 기록하는 메소드이다. 인수로는 성공적인 요청을 의미하는 200, 요청에 대한 응답의 형식이 HTML임을 알리고 있다. 형식이 문자열일 경우 'text/plain' 을 적으면 된다.
  • res.write 메소드에는 클라이언트로 보낼 데이터를 인수로 지정한다. 여러번 호출도 가능하다.
  • res.end 는 응답을 종료하는 메소드이다. 인수를 지정해서 클라이언트로 값을 보내고 종료할 수도 있다.

 

 

그런데 위의 코드에서 느꼈다시피 res 객체의 메소드에 일일이 HTML을 적는것은 매우 비효율적이다. 미리 HTML 파일을 만들어서 fs 모듈로 읽어버리면 훨씬 더 효율적일것이다.

 

const http = require('http');
const fs = require('fs').promises;

const server = http.createServer(async (req, res) => {
	try {
		res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
		const data = await fs.readFile('./server2.html');
		res.end(data);
	} catch (err) {
		console.error(err);
		res.writeHead(200, { 'Content-Type': 'text/plain; charset=utf-8' });
		res.end(err.message);
	}
}).listen(3000);
server.on('listening', () => {
	console.log('3000번 포트에서 서버 대기중');
});
server.on('error', (error) => {
	console.error(error);
});

fs 모듈의 메소드들은 콜백 형식이므로 사용하기에 불편하다. 따라서 fs 모듈을 promise형태로 바꿔주었다.

사용법은 여기 를 참고해라

 

 

createServer 메소드의 콜백함수에 async라는 예약어를 붙이고, fs.readFile메소드 앞에 await을 붙였다.  fs.readFile 메소드는 비동기 처리 메소드이고 프로미스 객체를 반환(const fs = require('fs').promises)  하므로 async/await을 사용할 수 있다.

 

 

try와 catch를 활용해서 error 처리를 꼭 해주자!

Node.js는 싱글 스레드이므로 오류로 인해서 메인 스레드가 멈춰버리면 프로세스가 멈춰버리므로 답이 없어진다...ㅎ