2014-09-12 20 views
10

API Node.js cho S3 cung cấp cho các mô tả sau đây cho dữ liệu trả về trong callback của getObject. Từ http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property:Làm thế nào để xác định loại dữ liệu trong S3.getObject()

Nội dung - (Bộ đệm, Kiểu được nhập, Blob, Chuỗi, ReadableStream) Dữ liệu đối tượng.

Đây có phải là sự thật? Không có cách nào để kiểm soát những thứ đó là gì?

Trả lời

12

Tôi không biết nếu bạn có thể kiểm soát trước các loại lĩnh vực data.Body cung cấp trong getObject() gọi lại. Nếu tất cả những gì bạn muốn làm là xác định xem bạn đã nhận được bộ đệm hay chưa, bạn có thể thử phương thức lớp Node's Buffer.isBuffer (data.Body).

Cách khác, bạn có thể muốn tránh vấn đề này hoàn toàn và sử dụng phương pháp này từ Amazon S3 documentation:

var s3 = new AWS.S3(); 
var params = {Bucket: 'myBucket', Key: 'myImageFile.jpg'}; 
var file = require('fs').createWriteStream('/path/to/file.jpg'); 
s3.getObject(params).createReadStream().pipe(file); 

Giả sử bạn sẽ được sử dụng mã này trong một môi trường callback Node.js async điển hình, nó có thể làm cho ý nghĩa hơn để xem mã như vậy:

var fs = require('fs'); 

function downloadFile(key, localPath, callback) { 
    var s3 = new AWS.S3(); 
    var params = {Bucket: 'myBucket', Key: key}; 
    var file = fs.createWriteStream(localPath); 

    file.on('close') { 
    callback(); 
    } 

    file.on('error', function(err) { 
    callback(err); 
    }); 

    s3.getObject(params).createReadStream().pipe(file); 
} 
+1

Nếu mã trên không tải xuống được, bạn làm cách nào để bẫy lỗi? – Mike

+1

@Mike: Trước hoặc sau trình xử lý 'đóng', thêm một cái gì đó như: file.on ('error', function (err) {callback (err);}); – Bruce

+0

Cảm ơn! Cảm ơn! Cảm ơn! – Mike

3

tôi không thể tìm thấy bất cứ cách nào để thay đổi kiểu Body một trong hai, tuy nhiên sau khi nhận thấy cơ thể là một bộ đệm, tôi chuyển bộ đệm vào một ReadableStream với tiện & này đẹp đơn giản function: AWS.util.buffer.toStream (hoặc có thể bạn muốn sử dụng một lib khác như streamifier).

tôi đang tìm kiếm một cái gì đó mà tôi có thể xác nhận lỗi trước khi làm bất cứ điều gì khác, trong ví dụ của Amazon nó dịch ra là "tạo Write Suối chỉ nếu không có lỗi".

s3.getObject(params, function(err, data) { 
    if (err) { 
     console.log(err); 
     return; 
    } 

    var file = require('fs').createWriteStream(name); 
    var read = AWS.util.buffer.toStream(data.Body); 

    read.pipe(file); 
    read.on('data', function(chunk) { 
     console.log('got %d bytes of data', chunk.length); 
    }); 
}); 
Các vấn đề liên quan