Я создал API, который генерирует предварительно подписанный URL для файлов, которые находятся в моем личном хранилище s3. Я хочу сохранить эти URL-адреса в массиве, чтобы я мог вызвать их из другого приложения. [«Предварительно подписанный FILE1 URL», «Предварительно подписанный FILE2 URL» и т. Д.] Однако я не совсем понимаю, как мой API читает команды, поэтому я пришел сюда за помощью.
- Почему страница, на которой размещен API, не показывает заполненный массив при вводе? Только до тех пор, пока я не обновлю страницу, она, наконец, заполнит массив.
Я хочу, чтобы массив сбрасывался каждый раз и заменял ссылки вместо добавления в конец массива. Мне также нужно, чтобы массив отображался сразу после загрузки страницы, а не обновлялся для просмотра результатов.
Это то, что отображается при входе на страницу, на которой обслуживается API:
Когда я нажимаю обновить, массив заполняется предварительно подписанными 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 отображаются перед объектами, сбивает меня с толку, поскольку я думал, что для циклов выполняются команды по порядку.