javascript - 在预签名的 URL 请求中获取响应代码 500?
问题描述
我正在尝试从我的 S3 存储桶中获取文件的预签名 URL。我能够读取文件并获取文件内容列表,但在尝试生成预签名 URL 时得到状态代码 500,如下所示:
reports.get('/xxx', async (req, res) => {
var AWS = require('aws-sdk');
var s3 = new AWS.S3();
var params = {
Bucket: config.xxx,
Key: 'xxx/xxx.json',
Expires: 60 * 5
}
try {
s3.getSignedUrl(params, function (err, url) {
if(err)throw err;
console.log(url)
res.json(url);
});
}catch (err) {
res.status(500).send(err.toString());
}
});
凭证默认为存储在我的机器上的凭证,aws configure
并且适用于我对同一个 S3 存储桶的所有其他 API 请求。
前端返回的错误说Uncaught (in promise) SyntaxError: Unexpected token T in JSON at position 0
。
这是我的前端实现:
fetch(config.api.urlFor('xxx'))
.then((response) => response.json())
.then((url) => {
console.log(url);
});
任何想法我做错了什么?
解决方案
getSignedUrl
是这样声明的,getSignedUrl(operation, params, callback) ⇒ String?
但你错过了operation
,试试我下面的函数
// Require s3 in global scope
const S3 = require('aws-sdk/clients/s3');
/**
* @param {String} bucketName
* @param {String} objectKey
* @param {Number} expiration
* @return {Promise}
*/
function getSignedUrl(bucketName, objectKey, expiration) {
return new Promise((resolve, reject) => {
const s3 = new S3(); // <= add options if needed
s3.getSignedUrl('getObject', { Bucket: bucketName, Key: objectKey, Expires: expiration }, (err, url) => {
if (err) {
return reject(err);
}
resolve(url);
});
});
}
推荐阅读
- angular - Angular 5 ngfor 同时让两个变量
- r - 使用 grepl 在管道中创建 data.table 列
- python - 根据接收到的字典信息动态写入文本文件
- apache-kafka - Kafka 经纪人间通信
- python - Keras:以适合 Google Cloud ML Engine 的格式保存模型(缺少功能)
- reactjs - 尝试使用 webpack 和 npm 构建 typescript 项目。发现 33 个错误。我确定它的版本错误,但无法弄清楚
- python - 计算时间序列中两点之间的角度
- hyperledger-fabric - 无法安装 sacc 链码
- javascript - var a = something 和 window.a = someting 之间有什么区别吗?
- mysql - MySQL FROM_UNIXTIME() 使用 sakila.actor 的 last_update 列返回 null