Создание нескольких предварительно подписанных URL с помощью API - PullRequest
0 голосов
/ 02 ноября 2019

Я создал API, который генерирует предварительно подписанный URL для файлов, которые находятся в моем личном хранилище s3. Я хочу сохранить эти URL-адреса в массиве, чтобы я мог вызвать их из другого приложения. [«Предварительно подписанный FILE1 URL», «Предварительно подписанный FILE2 URL» и т. Д.] Однако я не совсем понимаю, как мой API читает команды, поэтому я пришел сюда за помощью.

  1. Почему страница, на которой размещен API, не показывает заполненный массив при вводе? Только до тех пор, пока я не обновлю страницу, она, наконец, заполнит массив.

Я хочу, чтобы массив сбрасывался каждый раз и заменял ссылки вместо добавления в конец массива. Мне также нужно, чтобы массив отображался сразу после загрузки страницы, а не обновлялся для просмотра результатов.

Это то, что отображается при входе на страницу, на которой обслуживается API: enter image description here

Когда я нажимаю обновить, массив заполняется предварительно подписанными URL-адресами:

["https://bucketname.s3.amazonaws.com/file1.pdf?AWSAccessKeyId=ACCESSKEY&Expires=1572669513&Signature=SIGNATURE","https://bucketname.s3.amazonaws.com/file2.pdf?AWSAccessKeyId=ACCESSKEY&Expires=1572669513&Signature=SIGNATURE"]

ОДНАКО, когда я обновляю страницу снова, она снова выдвигает эти два файласоздание массива четырех элементов вместо двух . И если я продолжу обновлять страницу, то добавлю еще две ссылки и так далее. (ПОЧЕМУ ЭТО СДЕЛАТЬ, ЕСЛИ ЦИКЛ ОСТАНОВИТСЯ НА 2 ИТЕРАЦИИ)

const express = require('express');
const bodyParser = require('body-parser');
const morgan = require('morgan');
const uuid = require('uuid');
const AWS = require('aws-sdk');
let config = require('./config');

var s3 = new AWS.S3();
s3.config.update({
    accessKeyId: config.accessKeyId,
    secretAccessKey: config.secretAccessKey,
    region: 'us-east-1'
});

var app = express();
var router = express.Router();

// Create an array that houses pre-signed Urls


// Loop through x amt of times (depending on number of documents)
// Push each url into an array called 'preSignedUrls'
// Exit loop and reset array to re-generate new urls
let preSignedUrls = [];
    function getSignedURL(req, res, next) {
    Key = ['file1.pdf', 'file2.pdf']
        for ( i = 0; i < Key.length; i++ ){
            var params = {
                Bucket: 'bucketName',
                Key: Key[i],
                Expires: 36000
            };
                console.log(Key.length);
                console.log(i);
                s3.getSignedUrl('getObject', params, function(err, signedURL) {
                    if (err) {
                        console.log(err);
                        return next(err);
                    } else {
                        console.log(signedURL);
                        console.log(params);
                        preSignedUrls.push(signedURL);
                    }
                });
        }
        res.json(preSignedUrls);

    }
router.route('/get_signed_url')
    .get(getSignedURL);

app.use(morgan('combined'));
app.use(bodyParser.json());
app.use('/v1', router);

var PORT = process.env.PORT || 3001;
var HOST = process.env.HOST || '10.123.456.789';

console.log("Listening on", HOST, PORT);
app.listen(PORT, HOST);

Это вывод из терминала node.js (AKA - команды журнала, которые я вставил в свой код для проверки вывода)

2
0
2
1
https://bucketname.s3.amazonaws.com/file1.pdf?AWSAccessKeyId=ACCESSKEY&Expires=1572669520&Signature=SIGNATURE
{ Bucket: 'bucketname',
  Key: 'file2.pdf',
  Expires: 36000 }
https://bucketname.s3.amazonaws.com/file2.pdf?AWSAccessKeyId=ACCESSKEY&Expires=1572669520&Signature=SIGNATURE
{ Bucket: 'bucketname',
  Key: 'file2.pdf',
  Expires: 36000 }

Что я нахожу странным в этом, так это то, что он регистрирует объект params как file2.pdf, но предварительно подписанный URL-адрес, который он выводит, показывает file1.pdf и file2.pdf в том порядке, в котором он должен,Кроме того, тот факт, что длина и переменная i отображаются перед объектами, сбивает меня с толку, поскольку я думал, что для циклов выполняются команды по порядку.

...