【问题标题】:AWS how to wait for headObject to resolve before generating getSignedUrl? [duplicate]AWS如何在生成getSignedUrl之前等待headObject解决? [复制]
【发布时间】:2017-06-09 03:12:11
【问题描述】:

我正在尝试在生成 SignedUrl 之前检查对象是否存在。但是,SignedUrl 在 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?

【问题讨论】:

  • resolve 是什么,它在哪里定义?可能你应该从这些回调中调用它
  • 这是在 AWS Lambda 上。 resolve 在函数的签名中。 ` return new Promise((resolve, reject) => {` 如何在调用 getSignedUrl 之前解析 headObject - 看起来通常的方法不起作用。
  • @Bergi 你能提出一个解决方案吗?我是 ES6 和 node.js 的新手,标准方法不起作用。
  • 正如我所说,将resolve 调用移到回调中。基本上就是@the_bluescreen dib 下面的内容
  • 嗨@Bergi,谢谢,但这对我不起作用!我在主要问题中添加了代码。删除了变量signedURL。

标签: node.js ecmascript-6 promise aws-lambda


【解决方案1】:

我在下面更新了您的代码。基本上,您是在完成通话之前解决承诺。

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

【讨论】:

  • 这里我有一个名为 no_image.png 的文件,我想在找不到实际 url 时为其生成签名的 url。这样我就无法做到这一点。因此,我尝试将 s3.getSignedUrl 添加到 if 部分和 else 部分,但效果保持不变。
猜你喜欢
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 2020-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多