2016-04-29 24 views
23

Trong dự án Node.js tôi đang cố gắng lấy lại dữ liệu từ S3.Cách nhận phản hồi từ S3 getObject trong Node.js?

Khi tôi sử dụng getSignedURL, mọi thứ hoạt động:

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

params của tôi là:

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

Nhược bằng tôi lấy ra URL để giao diện điều khiển và dán nó vào trình duyệt web, nó tải về các tôi cần.

Tuy nhiên, nếu tôi cố gắng sử dụng getObject Tôi nhận được tất cả các loại hành vi lạ. Tôi tin rằng tôi chỉ sử dụng nó không chính xác. Đây là những gì tôi đã cố gắng:

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

Đầu ra:

{ 
    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 

Vì vậy, nó xuất hiện rằng đây là hoạt động bình thường. Tuy nhiên, khi tôi đặt điểm ngắt trên một trong số console.log s, IDE (NetBeans) của tôi ném lỗi và từ chối hiển thị giá trị của dữ liệu. Trong khi điều này chỉ có thể là IDE, tôi quyết định thử các cách khác để sử dụng getObject.

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

Điều này không xuất ra bất cứ điều gì. Đặt điểm ngắt trong các chương trình cho biết mã không bao giờ đạt đến một trong số console.log giây. Tôi cũng đã thử:

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

Tuy nhiên, điều này cũng không xuất ra bất cứ điều gì và đặt điểm ngắt cho biết không bao giờ đạt được console.log.

Tôi đang làm gì sai?

+0

Đối tượng 'aws' của bạn có thực sự là một đối tượng mới của đối tượng' aws.S3' không? Ngoài ra, phản hồi từ 'getObject()' có được trả về một câu trả lời http hay là nó đang được dẫn tới một tệp không? – peteb

+0

@peteb 'aws = AWS.S3 mới()'. Phản hồi không nên được gửi đến một tệp. Tôi cần phải sử dụng nó trong Javascript –

+0

Vì vậy, nó là an toàn để giả định rằng các nội dung là JSON hoặc XML? – peteb

Trả lời

47

Khi làm một getObject() từ API S3, theo docs nội dung của tập tin của bạn đang nằm ở Body bất động sản, mà bạn có thể nhìn thấy từ đầu ra mẫu của bạn. Bạn cần phải có mã trông giống như sau

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

Bạn có thể không cần để tạo ra một bộ đệm mới từ đối tượng data.Body nhưng nếu bạn cần bạn có thể sử dụng mẫu ở trên để đạt được điều đó.

+0

Vì vậy, dữ liệu quay lại dường như là một đối tượng 'Bộ đệm', mà tôi không quen thuộc. Về mặt lý thuyết tôi có thể sử dụng 'new Buffer (data.Body) .toString ('utf-8');' để truy cập nội dung? –

+1

Nếu nội dung đã là Bộ đệm, không cần phải tạo Bộ đệm mới từ đó. Đơn giản chỉ cần thực hiện 'data.Body.toString ('utf-8');'. Bộ đệm là biểu diễn dữ liệu nhị phân trong nút, nếu bạn cần thêm thông tin [đây là tài liệu] (https://nodejs.org/api/buffer.html) – peteb

+0

Cảm ơn bạn! Điều này sẽ dễ dàng hơn nhiều nếu làm việc thông qua nếu tôi thực sự có thể có được một điểm dừng làm việc. Vì lý do nào đó (và đây là nơi duy nhất tôi có điều này xảy ra), trong hàm Netbeans từ chối hiển thị bất kỳ giá trị biến nào –

0

Thoạt nhìn, có vẻ như bạn không làm gì sai nhưng bạn không hiển thị tất cả mã của mình. Sau đây làm việc cho tôi khi tôi lần đầu tiên được kiểm tra ra S3 và 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()); 
     }); 
    } 
}); 
2

Hoặc bạn có thể bạn minio-js client libraryget-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) 
    }) 
}) 

Disclaimer: Tôi làm việc cho Minio mã nguồn mở của nó, lưu trữ S3 tương thích đối tượng viết bằng golang với các thư viện client có sẵn trong Java, Python, Js , golang.

Các vấn đề liên quan