2017-08-24 2 views
1

署名付きURLを生成するためのコードスニペットがあります。以下のreturnステートメントは、常に空のURLを返します。残りのデータは正しく解決されます。私がデバッグすると、return callbackが最初に実行され、function validSignedURLresolve部分が呼び出されることがわかります。約束を使用してオブジェクトが存在する場合はAWS署名付きURL

awsHelper 
     .s3vldSignedURL(s3Link) 
     .then(function(signedURL) { 
      data[1].url = signedURL; 
      return callback(null, successResponse.getResponse(context, 'OK', data)); 
     }); 

s3vldSignedURLは以下の機能に対応しています。ここでs3.headobjectは有望なベースで、ファイルがs3に存在するかどうかを確認するために使用されます。この関数を一般的なものにして、任意のs3オブジェクトに対して署名付きのURLを生成できるようにします。 function getSignedURL以下

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

ザは、常にオブジェクトが存在するかどうかにかかわらず、署名されたURLを返します。また

、どのように私は、trueまたはfalseを返し同期呼び出しに関数呼び出しs3.headObject(params)を変換することができますか?

+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

これは、オブジェクトが約束を使用して存在する場合、AWS署名付きURLの完全な関数定義と呼び出しです。 AWS Lambdaを使用している場合は、s3権限を追加する必要があります。

  • URLはgetSignedURLが存在するかどうかを検証する必要がない場合は、オブジェクトが、その後でない場合には、空のURLを返します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の前に人口が設定されているフィールドをいくつか持ち、署名付きのURLとともに返されます。

validSignedURL(bucketName, s3Link + fileName).then(function(signedURL) { 
     data.url = signedURL; 
     return callback(null, successResponse.getResponse(context, 'OK', data)); 
     }); 
関連する問題