Node.js 管道超级代理响应到快速响应

Node.js 管道超级代理响应到快速响应,node.js,express,superagent,Node.js,Express,Superagent,我正试图用express应用程序“代理”某个文件。为什么下面的代码不起作用 var app = require('express')() var request = require('superagent') app.get('/image', function(req, res, next) { request('http://s3.amazonaws.com/thumbnails.illustrationsource.com/huge.104.520060.JPG') .then

我正试图用express应用程序“代理”某个文件。为什么下面的代码不起作用

var app = require('express')()
var request = require('superagent')
app.get('/image', function(req, res, next) {
  request('http://s3.amazonaws.com/thumbnails.illustrationsource.com/huge.104.520060.JPG')
    .then(function(_res) {
      _res.pipe(res)
    })
})

app.listen(3001, function() {
  console.log('listen')
})
当我直接“wget”一个文件时,它可以工作:

$ wget http://s3.amazonaws.com/thumbnails.illustrationsource.com/huge.104.520060.JPG
--2016-07-20 11:44:33--  http://s3.amazonaws.com/thumbnails.illustrationsource.com/huge.104.520060.JPG
Resolving s3.amazonaws.com... 54.231.120.106
Connecting to s3.amazonaws.com|54.231.120.106|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 21026 (21K) [image/jpeg]
Saving to: 'huge.104.520060.JPG'

huge.104.520060.JPG                           100%[==============================================================================================>]  20.53K  --.-KB/s    in 0.1s

2016-07-20 11:44:34 (203 KB/s) - 'huge.104.520060.JPG' saved [21026/21026]
当我调用enpdpoint时,它永远不会结束:

$ wget localhost:3001/image
--2016-07-20 11:45:00--  http://localhost:3001/image
Resolving localhost... 127.0.0.1, ::1
Connecting to localhost|127.0.0.1|:3001... connected.
HTTP request sent, awaiting response...
一些细节:

$ npm -v
3.9.5

$ npm list --depth=0
express-superagent-pipe-file
├── express@4.14.0
└── superagent@2.1.0

superagent的响应对象不应被视为流,因为它可能已经是自动序列化的结果(例如,从JSON到JavaScript对象)。不使用响应对象,而是声明您可以直接将superagent请求通过管道传输到流:

var app = require('express')()
var request = require('superagent')
app.get('/image', function(req, res, next) {
  request('http://s3.amazonaws.com/thumbnails.illustrationsource.com/huge.104.520060.JPG')
    .pipe(res)
})

app.listen(3001, function() {
  console.log('listen')
})

有了承诺,可以通过以下方式下载:

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

const download = (url) => {
    return superagent.get(url)
    .then((response) => {
        const stream = fs.createWriteStream('file.ext');
        return response.pipe(stream);
    });
};

谢谢它起作用了。但是
\u res.pipe
函数在这种情况下做什么呢?@kharandziuk它似乎依赖于实现。根据,Node.js中的
Response
对象实际上是
ReadableStream
,但它是一个私有API,不应该在外部使用。文档中没有任何内容表明响应对象可以用作可读流。如果您仍然想知道
\u res.pipe
之后会发生什么,下面是一个很好的注释: