如果对象使用promise,则AWS签署url
我有一个用于生成签名url的代码片段。 下面的return
语句总是返回空的url。 其余的数据正确解决。 当我debugging时,我看到return callback
function validSignedURL
首先被执行,然后function validSignedURL
的resolve
部分被调用。
awsHelper .s3vldSignedURL(s3Link) .then(function(signedURL) { data[1].url = signedURL; return callback(null, successResponse.getResponse(context, 'OK', data)); });
s3vldSignedURL
映射到下面的函数。 这里s3.headobject
是基于promise的,用来检查一个文件是否存在于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,而不pipe对象是否存在。
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)
转换为返回true或false的同步调用?
这是完整的函数定义,如果对象使用promise,则调用AWS签名的url。 如果您正在使用AWS Lambda,则需要添加s3权限。
- 如果不需要validationurl是否存在,则
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)); });