2016-04-29 23 views
23

Node.jsプロジェクトで、S3からデータを取得しようとしています。Node.jsのS3 getObjectからの応答を取得する方法は?

私はgetSignedURLを使用すると、すべての作品:

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

私のparamsは、次のとおりです。

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に達することはありませんされていることを示しています。

私は間違っていますか?

+0

あなたの 'aws'オブジェクトは実際に' aws.S3'オブジェクトの新しいインスタンスですか?また、 'getObject()'からの応答がHTTPレスポンスに返されるのか、それともファイルにパイプされていますか? – peteb

+0

@peteb 'aws = new AWS.S3()'応答はファイルにパイプされるべきではありません。私はJavascriptでそれを使用する必要があります –

+0

それで、内容がJSONかXMLであると仮定するのは安全でしょうか? – peteb

答えて

47

ファイルの内容は、あなたが見ることができるBodyプロパティに位置していdocsごとに、S3のAPIからgetObject()をやってあなたのサンプル出力から。あなたは、あなたがdata.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 
}); 

ようになり、コードを持っている必要があります。また

+0

戻ってくるデータは、私が慣れていない 'Buffer'オブジェクトのようです。理論的には、新しいバッファ(data.Body).toString( 'utf-8');を使用してコンテンツにアクセスできますか? –

+1

コンテンツが既にバッファーである場合、そのバッファーから新しいバッファーを作成する必要はありません。単に 'data.Body.toString( 'utf-8');'を実行するだけです。バッファは、詳細情報が必要な場合は、ノードのバイナリデータを表します。[ここにはドキュメントがあります](https://nodejs.org/api/buffer.html) – peteb

+0

ありがとうございます!実際にブレークポイントを稼働させることができれば、これで作業が非常に簡単になります。どんな理由であれ(これは私がこれを起こした唯一の場所です)、関数内でNetbeansは変数値を表示することを拒否します –

0

あなたは何か間違っているようには見えませんが、あなたのコードをすべて表示しているわけではありません。私が最初にS3とノードをチェックアウトされたときに、次は私のために働いた:

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()); 
     }); 
    } 
}); 
2

あなたでしますminio-js client libraryの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そのオープンソースのために働く、Javaで使用可能なクライアントライブラリとgolangで書かれたS3互換のオブジェクトストレージ、PythonJsgolang