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