2017-01-26 2 views
2

Я использую модуль Node.js request, чтобы сделать запрос http и хочу передать ответ на какой-то поток. Вот два фрагмента кода:Node.js pipe http request & Promises

Правильно действующий пример. Я просто передаю ответ от события response.

const fs = require('fs') 
const path = require('path') 
const request = require('request') 

const filepath = path.resolve('./tmp.zip') 
const ws = fs.createWriteStream(filepath) 

function get() { 
    return new Promise((resolve, reject) => { 
     request.get(uri, options) 
      .on('response', (res) => { 
       ws.on('finish',() => console.log('finish')) 
       res.pipe(ws) 
       resolve() 
      }) 
      .on('error', (err) => { 
       reject(err) 
      }) 
    }) 
} 

get().then(() => { 
    console.log('done') 
}).catch((err) => console.log(err)) 

Не работает должным образом пример. Я передаю ответ в resolve callback обещания и трубы от них по обещанию then callback. Размер файла такого подхода - smoller, а затем из первого правильно работающего подхода.

const fs = require('fs') 
const path = require('path') 
const request = require('request') 

const filepath = path.resolve('./tmp.zip') 
const ws = fs.createWriteStream(filepath) 

function get() { 
    return new Promise((resolve, reject) => { 
     request.get(uri, options) 
      .on('response', (res) => { 
       resolve(res) 
      }) 
      .on('error', (err) => { 
       reject(err) 
      }) 
    }) 
} 

get().then((res) => { 
    ws.on('finish',() => console.log('finish')) 
    res.pipe(ws) 
}).catch((err) => console.log(err)) 

Пожалуйста, скажите, почему второй пример не работает должным образом?

ответ

-1

Это странно. Я сделал это с http-модулем не с запросом ...

const fs = require('fs'); 
const path = require('path'); 
const http = require('http'); 

const filepath = path.resolve('./index.html'); 
const ws = fs.createWriteStream(filepath); 
const options = { 
    hostname: "your_url", 
    port: "80", 
    path: "/index.html" 
}; 

function get() { 
    return new Promise((resolve, reject) => { 
     http.get(uri, function(res) { 
      resolve(res); 
     }); 
    }); 
} 

get().then(function(res) { 
    console.log('then'); 
    ws.on('finish',() => { 
     console.log('finish'); 
    }) 
    res.pipe(ws); 
}).catch((err) => console.log(err)); 
Смежные вопросы