I am trying to check if an Object exists before generating a SignedUrl. However the SignedUrl returns before the headObject, generating a link that points to non-existing object.
var params = {
Bucket: bucket,
Key: path,
};
var signedURL = "none";
s3.headObject(params, function (err, metadata) {
if (err && err.code === 'NotFound')
params.Key = 'no_image.png';
params.Expires = 900;
s3.getSignedUrl('getObject', params, function (err, url) {
signedURL = url;
if (err)
console.log("Generation of Signed url failed");
else
console.log("Generated Signed url");
});
});
console.log("Generating PreSigned Link ... Success");
return resolve(signedURL);
Looks like following code also does not work:
var someVar = s3.headObject(params);
someVar.then(() ...
As suggested looked at this post - Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference and it tells me why it happens but not how to fix it.
Here is the new code piece I tried by moving the return inside the callback:
s3.headObject(params, function (err, metadata) {
params.Expires = 900;
if (err && err.code === 'NotFound')
params.Key = 'no_image.png';
s3.getSignedUrl('getObject', params, function (err, url) {
if (err)
return resolve("none");
else
return resolve(url);
});
});