NodeJS:来自回调api的Amazon s3 createReadStream

时间:2015-11-15 21:41:39

标签: node.js amazon-web-services amazon-s3 callback render

我在使用带有s3服务的节点的aws-sdk包时遇到了一些异常现象。考虑以下两个选项。选项1是在线处理文件呈现的一些示例,选项2是在官方API上描述getObject(params, callback)的方式。

var AWS = require('aws-sdk') //Assume the credentials are set for the examples below

// This option works
app.get('/option1', function(req, res) {
    var s3 = new AWS.S3({signatureVersion: 'v4'});
    var file = s3.getObject({Bucket: 'bucket', Key: 'key'});
    file.createReadStream().pipe(res)
});

// This option doesn't work
app.get('/option2', function(req, res) {
    var s3 = new AWS.S3({signatureVersion: 'v4'});
    s3.getObject({Bucket: 'bucket', Key: 'key'}, function(err, file) {
        if (err) {
            //handle error
            throw err;
        }
        file.createReadStream().pipe(res)
    });
});

我现在面临的问题是我希望能够捕获错误(例如不存在的密钥)。当密钥无法匹配时,选项1会导致崩溃,如果找到,则选项2不会渲染返回的文件。

我遇到了可能的解决方案,但他们都觉得有点解决方法 - 是的:

1)使用try / catch around选项1,但是编程社区似乎不赞成使用try / catch。

2)创建我自己的回调函数包装器,首先尝试检索有关对象的信息,如果有对象则返回错误,或者某种类型的' true'没有错误发生时的布尔值(这意味着密钥有效),然后执行选项1.但是,这将需要多个s3请求一个对象,并不保证多个调用之间的返回一致性。

最好的解决方案是如果createReadStream函数使用选项2,但我无法使其工作。它返回createReadStream不是函数。选项2返回的文件对象具有以下属性:

AcceptRanges:  bytes
LastModified:  Sun, 15 Nov 2015 16:50:42 GMT
ContentLength: 30100
ETag:          "67d5ee96ac23f9044dda62e081b17d1a"
ContentType:   application/octet-stream
Metadata: 

Body: [<30100 numbers between 0 and 255>]

我还尝试从Body属性创建一个读取流,但它也没有工作。如果相关,上面的对象是一个小图像。

0 个答案:

没有答案