小编典典

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

node.js

在一个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.logs
之一上设置断点时,我的IDE(NetBeans)会引发错误并拒绝显示数据值。尽管这可能只是IDE,但我还是决定尝试其他使用方式getObject

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永远不会到达。

我究竟做错了什么?


阅读 322

收藏
2020-07-07

共1个答案

小编典典

当执行getObject()从S3
API,按照文档文件的内容都位于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对象创建新的缓冲区,但是如果需要,可以使用上面的示例来实现。

2020-07-07