使用 API 生成多个预签名网址
Generating multiple pre-signed urls with an API
我创建了一个 API,它为我的私人 s3 存储桶中的文件生成一个预签名的 url。我想将这些 url 存储到一个数组中,以便我可以从另一个应用程序调用它们。 ["FILE1 pre-signed url","FILE2 pre-signed url", etc..] 但是,我对我的 API 如何读取命令感到困惑,所以我来这里寻求帮助。
- 为什么承载 API 的页面在我输入时不显示已填充的数组?直到我刷新页面,它才最终填充数组。
我希望数组每次都重置并替换链接而不是添加到数组的末尾。我还需要数组在页面加载后立即显示,而不是刷新它以查看结果。
这是我进入 API 所在的页面时显示的内容:
当我点击刷新时,数组中填充了预先签名的 urls:
["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"]
但是,当我再次刷新页面时,它再次推送这两个文件,使数组 four 元素而不是 two。如果我不断刷新页面,它会不断添加两个 url,依此类推。 (如果循环在 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 终端的输出(也就是我放入代码中用于测试输出的日志命令)
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 显示在对象之前这一事实让我感到困惑,因为我认为循环按顺序执行命令。
因为 signedURL 是来自 s3.getSignedUrl() 的响应。它是 运行 异步的并且有它自己的值和上下文。
但另一方面,可变参数将 return 主要是 for 循环的最后一个值。这是因为函数 s3.getSignedUrl 还没有执行,for 循环提前执行了。 for 循环不等待 s3.getSignedUrl() 作为其异步完成。
如果你想保留 i 值,你可能喜欢使用箭头函数。
这是其他线程上执行此操作的方法。
我创建了一个 API,它为我的私人 s3 存储桶中的文件生成一个预签名的 url。我想将这些 url 存储到一个数组中,以便我可以从另一个应用程序调用它们。 ["FILE1 pre-signed url","FILE2 pre-signed url", etc..] 但是,我对我的 API 如何读取命令感到困惑,所以我来这里寻求帮助。
- 为什么承载 API 的页面在我输入时不显示已填充的数组?直到我刷新页面,它才最终填充数组。
我希望数组每次都重置并替换链接而不是添加到数组的末尾。我还需要数组在页面加载后立即显示,而不是刷新它以查看结果。
这是我进入 API 所在的页面时显示的内容:
当我点击刷新时,数组中填充了预先签名的 urls:
["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"]
但是,当我再次刷新页面时,它再次推送这两个文件,使数组 four 元素而不是 two。如果我不断刷新页面,它会不断添加两个 url,依此类推。 (如果循环在 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 终端的输出(也就是我放入代码中用于测试输出的日志命令)
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 显示在对象之前这一事实让我感到困惑,因为我认为循环按顺序执行命令。
因为 signedURL 是来自 s3.getSignedUrl() 的响应。它是 运行 异步的并且有它自己的值和上下文。 但另一方面,可变参数将 return 主要是 for 循环的最后一个值。这是因为函数 s3.getSignedUrl 还没有执行,for 循环提前执行了。 for 循环不等待 s3.getSignedUrl() 作为其异步完成。 如果你想保留 i 值,你可能喜欢使用箭头函数。
这是其他线程上执行此操作的方法。