问题 如何确定S3.getObject()中的数据类型


S3的node.js API为回调中返回的数据提供了以下描述 getObject。从 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property :

Body - (Buffer,Typed Array,Blob,String,ReadableStream)对象数据。

这是真的吗?有没有办法控制这些东西是哪一种?


2920
2017-09-12 16:03


起源



答案:


我不知道你是否可以提前控制getObject()回调中提供的data.Body字段的类型。如果你想做的就是确定你是否收到了缓冲区,你可以试试 Node的Buffer.isBuffer(data.Body)类方法。

或者,您可能希望完全避免该问题,并使用亚马逊的这种方法 S3文档

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

假设您将在典型的node.js异步回调环境中使用此代码,那么查看代码可能更有意义:

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

12
2017-09-12 22:39



如果上面的代码无法下载,你如何捕获错误? - Mike
@Mike:在'close'处理程序之前或之后,添加类似:file.on('error',function(err){callback(err);}); - Bruce
谢谢!谢谢!谢谢! - Mike
我在该示例中编辑了该错误处理程序。本来应该在那里。 - Bruce


答案:


我不知道你是否可以提前控制getObject()回调中提供的data.Body字段的类型。如果你想做的就是确定你是否收到了缓冲区,你可以试试 Node的Buffer.isBuffer(data.Body)类方法。

或者,您可能希望完全避免该问题,并使用亚马逊的这种方法 S3文档

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

假设您将在典型的node.js异步回调环境中使用此代码,那么查看代码可能更有意义:

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

12
2017-09-12 22:39



如果上面的代码无法下载,你如何捕获错误? - Mike
@Mike:在'close'处理程序之前或之后,添加类似:file.on('error',function(err){callback(err);}); - Bruce
谢谢!谢谢!谢谢! - Mike
我在该示例中编辑了该错误处理程序。本来应该在那里。 - Bruce


我找不到任何改变Body类型的方法,但是在注意到Body是一个缓冲区之后,我将缓冲区转换为ReadableStream,这个方便且非常简单 功能AWS.util.buffer.toStream (或者你可能想要使用另一个lib streamifier)。

我正在寻找可以在做其他事情之前验证错误的东西,在亚马逊的例子中,它转换为“只有在没有错误的情况下才创建写入流”。

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

3
2017-08-14 13:08