如何从Node.js中的S3 getObject得到响应?

在一个Node.js项目中,我试图从S3获取数据。

当我使用getSignedURL ,一切正常。

 aws.getSignedUrl('getObject', params, function(err, url){ console.log(url); }); 

我的参数是:

 var params = { Bucket: "test-aws-imagery", Key: "TILES/Level4/A3_B3_C2/A5_B67_C59_Tiles.par" 

如果我将URL输出到控制台并粘贴到Web浏览器中,它会下载我需要的文件。

但是,如果我尝试使用getObject我会遇到各种奇怪的行为。 我相信我只是不正确地使用它。 这是我试过的:

 aws.getObject(params, function(err, data){ console.log(data); console.log(err); }); 

输出:

 { AcceptRanges: 'bytes', LastModified: 'Wed, 06 Apr 2016 20:04:02 GMT', ContentLength: '1602862', ETag: '9826l1e5725fbd52l88ge3f5v0c123a4"', ContentType: 'application/octet-stream', Metadata: {}, Body: <Buffer 01 00 00 00 ... > } null 

所以看来,这是正常工作。 但是,当我在其中一个console.log上放置断点时,IDE(NetBeans)会抛出一个错误,并拒绝显示数据的值。 虽然这可能只是IDE,但我决定尝试其他方法来使用getObject

 aws.getObject(params).on('httpData', function(chunk){ console.log(chunk); }).on('httpDone', function(data){ console.log(data); }); 

这不会输出任何东西。 放置一个断点表明代码永远不会到达console.log的任何一个。 我也试过:

 aws.getObject(params).on('success', function(data){ console.log(data); }); 

但是,这也不会输出任何内容,并放置一个断点显示console.log永远不会到达。

我究竟做错了什么?

当从S3 API执行getObject() ,根据文档 , 文件的内容位于Body属性中,您可以从示例输出中看到该属性。 你应该有如下所示的代码

 const aws = require('aws-sdk'); const s3 = new aws.S3(); // Pass in opts to S3 if necessary var getParams = { Bucket: 'abc', // your bucket name, Key: 'abc.txt' // path to the object you're looking for } s3.getObject(getParams, function(err, data) { // Handle any error and exit if (err) return err; // No error happened // Convert Body from a Buffer to a String let objectData = data.Body.toString('utf-8'); // Use the encoding necessary }); 

你可能不需要从data.Body对象创build一个新的缓冲区,但是如果你需要的话,你可以使用上面的例子来实现。

另外,你可以你minio-js客户端库 get-object.js

 var Minio = require('minio') var s3Client = new Minio({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY' }) var size = 0 // Get a full object. s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) { if (e) { return console.log(e) } dataStream.on('data', function(chunk) { size += chunk.length }) dataStream.on('end', function() { console.log("End. Total size = " + size) }) dataStream.on('error', function(e) { console.log(e) }) }) 

免责声明:我为Minio工作它的开放源代码,用golang编写的兼容S3的对象存储,用Java , Python , Js , Golang提供的客户端库。

乍一看,你看起来不像是在做任何错误的事情,但是你并没有显示你所有的代码。 当我第一次检查S3和Node时,以下工作适用于我:

 var AWS = require('aws-sdk'); if (typeof process.env.API_KEY == 'undefined') { var config = require('./config.json'); for (var key in config) { if (config.hasOwnProperty(key)) process.env[key] = config[key]; } } var s3 = new AWS.S3({accessKeyId: process.env.AWS_ID, secretAccessKey:process.env.AWS_KEY}); var objectPath = process.env.AWS_S3_FOLDER +'/test.xml'; s3.putObject({ Bucket: process.env.AWS_S3_BUCKET, Key: objectPath, Body: "<rss><data>hello Fred</data></rss>", ACL:'public-read' }, function(err, data){ if (err) console.log(err, err.stack); // an error occurred else { console.log(data); // successful response s3.getObject({ Bucket: process.env.AWS_S3_BUCKET, Key: objectPath }, function(err, data){ console.log(data.Body.toString()); }); } });