在一个Node.js项目中,我试图从S3取回数据。
当我使用时getSignedURL,一切正常:
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各种奇怪的行为。我相信我只是使用不正确。这是我尝试过的:
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.logs 之一上设置断点时,我的IDE(NetBeans)会引发错误并拒绝显示数据值。尽管这可能只是IDE,但我还是决定尝试其他使用方式getObject。
console.log
aws.getObject(params).on('httpData', function(chunk){ console.log(chunk); }).on('httpDone', function(data){ console.log(data); });
这不会输出任何内容。放置一个断点表明代码永远不会到达console.logs中的任何一个。我也尝试过:
aws.getObject(params).on('success', function(data){ console.log(data); });
但是,这也不会输出任何内容,放置一个断点表明console.log永远不会到达。
我究竟做错了什么?
当执行getObject()从S3 API,按照文档文件的内容都位于Body属性,您可以从您的样品输出看到。您应该具有类似于以下内容的代码
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对象创建新的缓冲区,但是如果需要,可以使用上面的示例来实现。
data.Body