1
我有一個代碼片段用於生成簽名的網址。以下return
語句總是返回空的url。其餘的數據被正確解析。當我調試時,我看到return callback
首先被執行,然後調用function validSignedURL
的resolve
部分。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同步調用?
避免['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