从nodejs请求到s3的stream响应

你如何使用请求下载一个文件的内容,并直接使用aws-sdk作为节点将其传输到s3?

下面的代码给我的Object #<Request> has no method 'read' ,这使得它看起来像请求不会返回一个可读的stream…

 var req = require('request'); var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}}); var imageStream = req.get(url) .on('response', function (response) { if (200 == response.statusCode) { //imageStream should be read()able by now right? s3.upload({Body: imageStream, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months console.log(err,data); }); } }); }); 

根据aws-sdk docs Body需要是一个ReadableStream对象。

我在这里做错了什么?

这可以使用s3-upload-stream模块,但是我宁愿限制我的依赖关系。

如果您手动侦听响应stream,则要使用response对象:

 var req = require('request'); var s3 = new AWS.S3({params: {Bucket: myBucket, Key: s3Key}}); var imageStream = req.get(url) .on('response', function (response) { if (200 == response.statusCode) { s3.upload({Body: response, ACL: "public-read", CacheControl: 5184000}, function (err, data) { //2 months console.log(err,data); }); } }); }); 

由于我的问题与@JoshSantangelo(S3上的零字节文件)有相同的问题:request@2.60.0和aws-sdk@2.1.43,让我添加一个替代解决scheme,使用Node自己的http模块(警告:真实的简化代码生活项目,并没有单独testing):

 var http = require('http'); function copyToS3(url, key, callback) { http.get(url, function onResponse(res) { if (res.statusCode >= 300) { return callback(new Error('error ' + res.statusCode + ' retrieving ' + url)); } s3.upload({Key: key, Body: res}, callback); }) .on('error', function onError(err) { return callback(err); }); } 

据我所知,问题是request不完全支持当前的节点streamAPI,而aws-sdk依赖于它。

参考文献:

  • 请求有关readable事件不正确的问题
  • 请求中的“新stream”支持的一般问题
  • 在aws-sdk中使用readable事件