Request.js

마데슾 : My Dev Space·2020년 3월 20일
0

Server

목록 보기
11/12

request library 참고하여 request 사용법을 익히면서 이해가 안가는 부분에대해 구글링등을 통해 알아본 내용에 대하여 정리합니다

const request = require('request');

request('http://www.google.com', function (error, response, body) {
  console.error('error:', error); // Print the error if one occurred
  console.log('statusCode:', response && response.statusCode); // Print the response status code if a response was received
  console.log('body:', body); // Print the HTML for the Google homepage.
});
  1. request 자체가 함수로서 호출되면 인자로 받은 url에 http request를 보내게 된다
  2. 1번에서 request를 보낸 결과물인 response가 callback의 두번째 인자로 전달되고, 서버의 반응 중 body 역할을 하는 string이 세번째 인자로 전달된다
request(url, function(err, res, body){...}).pipe(입력스트림)

request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))

위의 코드에서 pipe가 어떤 역할을 하는지 궁금해서 구글링을 해보았다. request()가 return하는 것이 무엇이길래 pipe 메소드를 호출할 수 있을까?

  1. request()가 리턴하는 것은 request(url)에서 보내는 http request에 대한 정보를 담고있다.
{
	"uri" {
    	"protocal" : "https:",
        "slashes" : true,
        "auth" : null,
        "host" : "www.naver.com",
        "port" : 443,
        "hostname" : "www.naver.com",
        "hash" : null,
        "search" : null,
        "pathname" : "/",
        "path" : "/",
        "href" : "https://www.naver.com"
    },
    "method" : "GET",
    "headers" : {
      "referer" : "http://www.naver.com"  
    }
}
  1. 요청에 대한 정보 및 옵션을 담은 객체에 pipe를 설정해주면 stream을 연결할 수 있다
    • 단, 요청이 모두 수행되고 반응까지 완료된 뒤에 pipe를 설정하면 의미가 없으므로 요청이 완료되기 전에 pipe를 설정해주어야한다.
const request = require("request");
const { fs } = require("file-system");
// const http = require("http-server");

const obj = request("http://www.naver.com", (err, res, body) => {});

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

setTimeout(() => {
  let timeout = 500;
  obj.pipe(fs.createWriteStream(timeout + ".txt"));
  console.log("DONE after " + timeout);
}, 500);

setTimeout(() => {
  let timeout = 2000;

  fs.writeFileSync("request_returns.txt", JSON.stringify(obj, null, 2));

  obj.pipe(fs.createWriteStream(timeout + ".txt"));
  console.log("DONE after " + timeout);
}, 2000);

notimeout.txt 파일이 생성되고 파일을 열어보니 아래와같은 내용이 담겨있었다.

pipe가 하는 역할이 무엇일까 궁금해서 구글링을 하다보니 아래와같은 내용을 알게되었다.

기본적으로 읽기 스트림은 'data', 'end', 'error' 이벤트를 가진 EventEmitter이다.

  • 'data' : 파일의 일부를 리턴한다
  • 'end' : 읽기가 완료되었을때 호출된다
  • 'error' : 에러가 발생했을때 호출된다
// 인터넷에서 파일을 요청하는 예시
var fs = require('fs');
var request = require('request');

var stream = request('http://i.imgur.com/dmetFjf.jpg');
var writeStream = fs.createWriteStream('test.jpg')

stream.on('data', function(data) {
	writeStream.write(data)
});

stream.on('end', fucntion () {
	writeStream.end();
});

stream.on('error', function(err) {
	console.log('something is wrong :( ');
	writeStream.close();
});

pipe는 입력을 출력으로 리다이렉트 할 수 있게 해주는 또다른 컨셉인데, 위의 파일 다운로드 예제를 아래와같이 pipe로 표현할 수 있다.

var fs = require('fs');
var request = require('request');

var stream = request('http://i.imgur.com/dmetFjf.jpg');
var writeStream = fs.createWriteStream('./testimg.jpg');

stream.pipe(writeStream);

pipe가 하는 일은, pipe로 stream 간에 read 와 write event 들을 연결해주는 것이다. 때문에 우리는 심지어 여러개의 pipe를 서로 연결할 수도 있다.

var fs = require('fs');
var request = require('request');
var gzip = require('zlib').createGzip();

var stream = request('http://i.imgur.com/dmetFjf.jpg');
var writeStream = fs.createWriteStream('./testimg.jpg');

// write gzipped image file
stream.pipe(gzip).pipe(writeStream);
profile
👩🏻‍💻 🚀

0개의 댓글