如果对象使用promise,则AWS签署url

我有一个用于生成签名url的代码片段。 下面的return语句总是返回空的url。 其余的数据正确解决。 当我debugging时,我看到return callback function validSignedURL首先被执行,然后function validSignedURLresolve部分被调用。

 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)); });