[Node.js] 스트림, 파이프로 응답하기

fs 모듈로 파일을 다루는 법은 이전 포스팅에서 언급한 적이 있다. 파일을 읽기 위해 readFile() 메소드를 사용하거나 파일을 스트림 객체로 읽을 수 있다. 둘 다 기능은 같지만, 스트림 객체파이프 메소드를 이용하는 것이 훨씬 간결하다.

스트림 객체, 파이프 메소드

파일은 스트림 객체로 읽을 수 있고 웹 서버의 응답 객체도 스트림으로 데이터를 전송할 수 있기 때문에 이 두 개의 스트림을 파이프로 서로 연결하면 된다. 즉, 파일을 스트림 객체로 읽은 후 pipe() 메소드로 응답 객체와 연결하면 별다른 코드 없이도 파일에 응답을 보낼 수 있다.

var http = require('http');
var fs = require('fs');
 
var server = http.createServer(function(req, res){
    console.log('클라이언트 요청이 들어옴');
    
    var filename = './house.jpg';
    var infile = fs.createReadStream(filename, {flags: 'r'});
    
    infile.pipe(res);
});
 
var port = 3000;
server.listen(port, function(){
    console.log('서버 시작됨');
});
 
server.on('connection'function(socket){
    var addr = socket.address();
    console.log('클라이언트 접속: %s, %d', addr.address, addr.port);
});
 
server.on('close'function(){
    console.log('서버 종료됨');
});
cs

createServer() 부분만 확인하면 된다. 나머지 코드는 이전에서 서버를 만들 때와 동일하다. 프로젝트 폴더에 house.jpg를 저장한 후 코드를 실행하고 localhost:3000에서 접속하면 이미지가 출력된다. 만약 readFile() 메소드를 사용했다면 콜백함수에서 data를 받아서 그 data를 res.write() 메소드로 출력해줘야 했을 것이다. 그러나 스트림을 사용할 경우 헤더를 설정할 수 없는 등의 제약도 존재한다.

댓글 없음:

Powered by Blogger.