署名付きURLを生成するためのコードスニペットがあります。以下のreturn
ステートメントは、常に空のURLを返します。残りのデータは正しく解決されます。私がデバッグすると、return callback
が最初に実行され、function validSignedURL
のresolve
部分が呼び出されることがわかります。約束を使用してオブジェクトが存在する場合は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)
を変換することができますか?
[ 'Promise'コンストラクタアンチパターン](https://stackoverflow.com/q/23803743/1048572?What-is-the-promise-construction-antipattern-and-how-to-avoid-を避けてくださいそれ)! – Bergi
また、[.then(...、...)と '.then(...).catch(...)'の違い](https://stackoverflow.com/q/24662289/1048572)を参照してください。しかし、あなたが 'callback'の後に' resolve'を見ている理由を説明してください(実際のコードでない限り)。 – Bergi
"*関数呼び出し' s3.headObject(params) 'を同期呼び出し*に変換するにはどうしたらいいですか?試してはいけない。 – Bergi