2017-06-09 33 views
0

我想在生成SignedUrl之前檢查對象是否存在。然而,SignedUrl在headObject之前返回,生成指向不存在對象的鏈接。AWS如何在生成getSignedUrl之前等待headObject解析?

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); 

看起來像下面的代碼也不起作用:

var someVar = s3.headObject(params); 
someVar.then(() ... 

至於建議看這篇文章 - Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference,它告訴我爲什麼會發生但不知道如何解決它。

這是新的代碼塊我試圖通過移動回調內部回報:

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

How to use promises with AWS headObject?

+0

什麼是'resolve',它在哪裏定義?可能你應該從這些回調*中調用它*。 – Bergi

+0

這在AWS Lambda上。解決方法是在函數的簽名中。 '返回新的Promise((resolve,reject)=> {'如何在調用getSignedUrl之前解析headObject - 看起來像通常的方法不起作用 –

+0

@Bergi您能否提出一個解決方案,我是ES6和節點的新手。 js和標準的方式不起作用 –

回答

0

我下面更新你的代碼。基本上,你在完成你的呼叫之前解決了承諾。

var params = { 
    Bucket: bucket, 
    Key: path, 
}; 

var signedURL = "none"; 

s3.headObject(params, function (err, metadata) { 
    params.Expires = 900; 

    if (err && err.code === 'NotFound') { 
     params.Key = 'no_image.png'; 
     resolve(signedURL); 
    } else { 
     s3.getSignedUrl('getObject', params, function (err, url) { 
      signedURL = url; 
      if (err) { 
       console.log("Generation of Signed url failed"); 
       reject(url); 
      } else { 
      resolve(signedURL); 
      } 
     }); 
    } 
}); 
+0

在這裏我有一個名爲no_image.png的文件我想爲未找到實際url時生成簽名url。這樣我就無法做到這一點。因此,我試圖將s3.getSignedUrl添加到if部分和其他部分,但效果保持不變。 –

相關問題