如果使用promises存在对象,则AWS签署URL

时间:2017-08-24 22:54:25

标签: node.js amazon-s3 promise

我有一个用于生成签名网址的代码段。以下return语句始终返回空URL。其余数据已正确解析。当我调试时,我看到首先执行return callback,然后调用resolve的{​​{1}}部分。

function validSignedURL

awsHelper .s3vldSignedURL(s3Link) .then(function(signedURL) { data[1].url = signedURL; return callback(null, successResponse.getResponse(context, 'OK', data)); }); 映射到下面的函数。这里s3vldSignedURL是基于promise的,用于检查s3中是否存在文件。我希望这个函数是通用的,这样我就可以用它为任何s3object生成一个签名的URL。

s3.headobject

以下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

另外,如何将函数调用function getSignedURL(bucket, path) { console.log("Generating Presigned Link ... "); const s3 = new aws.S3(); let params = { Bucket: bucket, Key: path }; return s3.getSignedUrl('getObject', params); } 转换为返回true或false的同步调用?

1 个答案:

答案 0 :(得分:0)

这是完整的函数定义,如果使用promises存在对象,则调用AWS signed url。如果您使用的是AWS Lambda,则需要添加s3权限。

  • 如果不需要验证网址是否存在,则getSignedURL是要使用的功能
  • 如果需要检查对象是否存在,则使用validSignedURL如果找不到则会返回一个空网址。

以下是我实施它的方式:

function getSignedURL(bucket, path) {
    console.log("Generating Presigned Link ... ");

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

    //expires in default 15 mins.
    return s3.getSignedUrl('getObject', params);
}

function validSignedURL(bucket, path) {
    console.log("Generating Presigned Link ... ");
    let params = {
        Bucket: bucket,
        Key: path
    };

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

调用函数并解决承诺。我在data之前填写了一些其他字段,这些字段与签名网址一起返回。

    validSignedURL(bucketName, s3Link + fileName).then(function(signedURL) {
        data.url = signedURL;
        return callback(null, successResponse.getResponse(context, 'OK', data));
        });