2017-08-24 18 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)); 
     });