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.
});
request
자체가 함수로서 호출되면 인자로 받은 url
에 http request를 보내게 된다request(url, function(err, res, body){...}).pipe(입력스트림)
request('http://google.com/doodle.png').pipe(fs.createWriteStream('doodle.png'))
위의 코드에서 pipe가 어떤 역할을 하는지 궁금해서 구글링을 해보았다. request()
가 return하는 것이 무엇이길래 pipe
메소드를 호출할 수 있을까?
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"
}
}
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이다.
// 인터넷에서 파일을 요청하는 예시
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);