我正在尝试从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);
});
有什么想法我做错了吗?
答案 0 :(得分:1)
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);
});
});
}