Node.jspipe道http请求&承诺

我使用一个Node.js 请求模块来发出一个http请求,并且想把响应传递给一些stream。 这里有两个代码段:

一个正常工作的例子 。 我只是响应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)) 

没有正确工作的例子 。 我将响应传递给resolvecallback的承诺和pipe道从他们承诺thencallback。 这种方法的文件大小是从第一个正常工作的方法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)) 

请说出为什么第二个例子不能正常工作?

真奇怪。 我使它与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));