如何在nodejs中为桶的每个键生成Url

How to generate Url for each key of a bucket in nodejs

我正在尝试为循环中存储桶的每个键生成 url,即迭代存储桶生成 url 并放入数组中。请建议我最好的方法。

这是我正在尝试的代码..

downloadByBusinessFlowId: function (req, res) {

        var AWS = require('aws-sdk');

        AWS.config.update({accessKeyId: sails.config.AwsCredential.AWS_ACCESS_KEY_ID, secretAccessKey: sails.config.AwsCredential.AWS_SECRET_ACCESS_KEY});
        var s3 = new AWS.S3();


        var params = {
          Bucket: sails.config.AwsCredential.bucket_name,
          Prefix: 'cc_' + req.param('cc')
        }

        const signedUrlExpireSeconds = 60 * 5;


        // console.log(url)

        var result = [];

        s3.listObjects(params, function (err, data) {
          if(err)throw err;
          dataLength = data.Contents.length;
          var flag = false;

          for(var i = 0; i < dataLength; i++){
               //need logic here and put url in json
           }
          console.log(result);
          return res.json(result);
        });

      },

我是这样做的(我已经从 aws-sdk 中承诺了 S3,这段代码来自我的项目,所以你可能需要稍微更改一下代码):

return Bluebird.try(function () {    
        const params = {
            Bucket: <BUKCET>, /* required */
            // ContinuationToken: '',
            Prefix: <PREFIX>,  //optional
            StartAfter: <STARTAFTER>  //optional
        };

        // Prefix is for filtering your objects if say you store objects like userID/message1 so prefix can be userID

        // List all objects, for Keys for which we will create URLs
        return AWS.S3.listObjectsV2Async(params);
    }).then(function (data) {
        console.log("ALL OBJECTS FOR REQUEST: ", data.Contents);

        const createSignedUrlPromises = [];
        const response = [];

        const message_ids = [];


        // For each object, create a promise for making signed url
        _.forEach(data.Contents, function (content) {
            const params = {
                Bucket: <BUCKET>,
                Key: content.Key,
                Expires: <EXPIRY>
            };   
            createSignedUrlPromises.push(AWS.S3.getSignedUrlAsync('getObject', params));
        });


        return Bluebird.all(createSignedUrlPromises).then(function (data) {
            console.log("URLS FOR VOICE MESSAGES: ", data);


            // data is an array of signed urls for all objects in your bucket
        });
    });