我有一个用于生成签名网址的代码段。以下return
语句始终返回空URL。其余数据已正确解析。当我调试时,我看到首先执行return callback
,然后调用resolve
的{{1}}部分。
function validSignedURL
awsHelper
.s3vldSignedURL(s3Link)
.then(function(signedURL) {
data[1].url = signedURL;
return callback(null, successResponse.getResponse(context, 'OK', data));
});
映射到下面的函数。这里s3vldSignedURL
是基于promise的,用于检查s3中是否存在文件。我希望这个函数是通用的,这样我就可以用它为任何s3object生成一个签名的URL。
s3.headobject
以下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
另外,如何将函数调用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);
}
转换为返回true或false的同步调用?
答案 0 :(得分:0)
这是完整的函数定义,如果使用promises存在对象,则调用AWS signed url。如果您使用的是AWS Lambda,则需要添加s3权限。
getSignedURL
是要使用的功能validSignedURL
如果找不到则会返回一个空网址。以下是我实施它的方式:
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
之前填写了一些其他字段,这些字段与签名网址一起返回。
validSignedURL(bucketName, s3Link + fileName).then(function(signedURL) {
data.url = signedURL;
return callback(null, successResponse.getResponse(context, 'OK', data));
});