首页 > 解决方案 > 在预签名的 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);
});

任何想法我做错了什么?

标签: javascriptnode.jsamazon-web-servicesamazon-s3

解决方案


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

推荐阅读