2017-08-24 39 views
1

我有一个代码片段用于生成签名的网址。以下return语句总是返回空的url。其余的数据被正确解析。当我调试时,我看到return callback首先被执行,然后调用function validSignedURLresolve部分。AWS签署的网址,如果对象存在使用承诺

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,而不管对象存在与否。

此外,我怎么能函数调用s3.headObject(params)转换为返回true或false同步调用?

+0

避免['Promise'构造反模式](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-它)! – Bergi

+0

另请参阅[.then(...,...)'和'.then(...).catch(...)'](https://stackoverflow.com/q/24662289/1048572)之间的区别。但是解释为什么你在'callback'后面看到'resolve'(除非这不是你的实际代码)。 – Bergi

+1

“*如何将函数调用's3.headObject(params)'转换为同步调用*” - 你不能。不要尝试。 – Bergi

回答

0

这是完整的函数定义,如果对象使用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)); 
     });