AWS 签名网址(如果对象存在,则使用承诺



我有一个用于生成签名网址的代码片段。下面的return语句始终返回空 url。其余数据已正确解析。当我调试时,我看到首先执行return callback,然后调用function validSignedURLresolve部分。

awsHelper
.s3vldSignedURL(s3Link)
.then(function(signedURL) {
data[1].url = signedURL;
return callback(null, successResponse.getResponse(context, 'OK', data));
});

s3vldSignedURL映射到下面的函数。这里s3.headobject是基于承诺的,用于检查 s3 中是否存在文件。我希望这个函数是通用的,以便我可以使用它为任何 s3object 生成一个有符号的 url。

function validSignedURL(bucket, path) {
console.log("Generating Presigned Link ... ");
const s3 = new aws.S3();
let params = {
Bucket: bucket,
Key: path
};
let checkObj = s3.getObject(params);
return new Promise(function(resolve, reject){
s3.headObject(params).promise()
.then(function (data) {
console.log('s3 File exists' + data);
resolve(getSignedURL(bucket, path));
}).catch(function (err) {
console.log('Generating Presigned Link ... Failed' + err);
resolve('');
});
});
}

下面的function getSignedURL始终返回一个签名的 url,无论对象是否存在。

function getSignedURL(bucket, path) {
console.log("Generating Presigned Link ... ");
const s3 = new aws.S3();
let params = {
Bucket: bucket,
Key: path
};
return s3.getSignedUrl('getObject', params);
}

另外,如何将函数调用s3.headObject(params)转换为返回真或假的同步调用?

这是完整的函数定义,如果使用 promise 存在对象,则调用 AWS 签名 URL。如果您使用的是 AWS Lambda,则需要添加 s3 权限。

  • 如果不需要验证 url 是否存在,则getSignedURL要使用的函数
  • 如果需要检查对象是否存在,请使用validSignedURL如果未找到,它将返回一个空 url。

以下是我如何实现它:

function getSignedURL(bucket, path) {
console.log("Generating Presigned Link ... ");
let params = {
Bucket: bucket,
Key: path
};
//expires in default 15 mins.
return s3.getSignedUrl('getObject', params);
}
function validSignedURL(bucket, path) {
console.log("Generating Presigned Link ... ");
let params = {
Bucket: bucket,
Key: path
};
return new Promise(function(resolve, reject){
s3.headObject(params).promise()
.then(function (data) {
console.log('s3 File exists' + data);
resolve(getSignedURL(bucket, path));
}).catch(function (err) {
console.log('Generating Presigned Link ... Failed' + err);
resolve('');
});
});
}

调用函数并解析承诺。我之前在data中填充了一些其他字段,这些字段与签名的 url 一起返回。

validSignedURL(bucketName, s3Link + fileName).then(function(signedURL) {
data.url = signedURL;
return callback(null, successResponse.getResponse(context, 'OK', data));
});

最新更新