我在使用带有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属性创建一个读取流,但它也没有工作。如果相关,上面的对象是一个小图像。