在预签名的URL请求上获得响应代码500?

时间:2018-12-21 07:57:41

标签: javascript node.js amazon-web-services amazon-s3

我正在尝试从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);
});

有什么想法我做错了吗?

1 个答案:

答案 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);
    });
  });
}