본문 바로가기

Node.js

nodejs request 모듈 기본 및 pipe 메소드에 대해

항상 nodejs에서 모듈들을 사용하다 보면 (초보입장에서는)


var request=require('request');


과연 require('request')가 리턴하는 녀석은 무엇일까

request()가 리턴하는 녀석은 무엇일까 등등 이러한 고민에 빠질 때가 있다.


내 경우의 또 다른 자바스크립트를 배우기 시작했던 때의 jQuery에 대한 것도 있다.

jQuery가 DOM조작 및 각종 소팅과 http요청을 편리하게 해준다는 건 주워듣고 jQuery를 써보려하는데

jQuery 자체는 뭐고 jQuery.get()은 뭐고 jQuery('div')가 리턴하는 녀석은 뭐고. 등등.


이번엔 평소에 궁금했던 request 모듈에 대해 정리해봤다

var request=require('request')

여기서 변수 request에 저장되는 것은

http request를 발생시켜주고 pipe기능까지 할 수 있는 녀석 그 자체이다.



request(url, function(err, res, body){

...

});

request녀석 그 자체가 함수로서 호출되면 인자로 받은 url에 http request를 보내게 되고,

그 response가 callback의 두 번째 인자로 전달되고, 서버의 반응 중 body 역할을 하는 string이 세 번째 인자로 전달된다.


그렇다면 

request(url, function(err, res, body){...}).pipe(입력스트림)

이렇게 쓰이는 경우 request()가 리턴하는 것이 무엇이길래 pipe 메소드를 호출할 수 있는 것일까.

이것이 항상 의문이었다...

request()가 리턴하는 것은 request(url)에서 보내는 http request에 대한 정보를 담고있는 것 같다.

그렇기때문에 그 요청에 대한 정보 및 옵션을 담은 객체에 pipe를 설정해주면 stream을 연결할 수 있는 것이다

허나 요청이 모두 수행되고 반응까지 완료된 뒤에 pipe를 설정하면 의미가 없으므로

요청이 완료되기 전에 pipe를 설정해주어야한다.

나의 컴퓨터를 기준으로는 500ms이후에 pipe를 설정해주어도 정상적으로 pipe 되지만

2000ms이후에는 아무 정보도 pipe를 통해 전달되지 않는다.

//request모듈, request모듈이 리턴하는 것이 각각 무엇을 하는지
//그리고 pipe method는 어떻게 쓰이는 것인지 간단히 공부해보기

var request=require('request');
var fs=require('fs')
var obj=request('http://www.naver.com', function(err, res, body){

});
request('http://www.naver.com', function(err, res, body){}).pipe(fs.createWriteStream('notimeout.txt'))

//실제로 request()에서 http request가 실행되기 전에 pipe메소드를 호출하면 제대로 작동함
//하지만 실제 http request가 실행되는 시점보다 늦게 pipe메소드를 호출하면 stream에 아무런 정보도 전달 안 됨.


//그 예시로 500ms와 2000ms 이후 pipe를 호출 해봄
setTimeout(function(){
  var timeout=500
  obj.pipe(fs.createWriteStream(timeout+'.txt'))
  console.log('DONE after '+timeout)
}, 500);

setTimeout(function(){
  var timeout=2000

  //그리고 추가적으로 request()이후 리턴되는 객체가 대체 무엇을 하는 녀석인지 알아보기 위해 파일에 저장해봄.
  fs.writeFileSync('request_returns.txt', JSON.stringify(obj, null, 2));
  //request() is an object contains the data of a http request
  
  obj.pipe(fs.createWriteStream(timeout+'.txt'))
  console.log('DONE after '+timeout)
}, 2000);