我正在使用NodeJS AWS SDK生成一个预先指定的S3 URL.doctor 给出example of generating a presigned URL分.

以下是我的确切代码(省略敏感信息):

const AWS = require('aws-sdk')

const s3 = new AWS.S3()
AWS.config.update({accessKeyId: 'id-omitted', secretAccessKey: 'key-omitted'})

// Tried with and without this. Since s3 is not region-specific, I don't
// think it should be necessary.
// AWS.config.update({region: 'us-west-2'})

const myBucket = 'bucket-name'
const myKey = 'file-name.pdf'
const signedUrlExpireSeconds = 60 * 5

const url = s3.getSignedUrl('getObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds
})

console.log(url)

生成的URL如下所示:

https://bucket-name.s3-us-west-2.amazonaws.com/file-name.pdf?AWSAccessKeyId=[access-key-omitted]&Expires=1470666057&Signature=[signature-omitted]

我正在将该URL复制到浏览器中,并得到以下响应:

<Error>
  <Code>NoSuchBucket</Code>
  <Message>The specified bucket does not exist</Message>
  <BucketName>[bucket-name-omitted]</BucketName>
  <RequestId>D1A358D276305A5C</RequestId>
  <HostId>
    bz2OxmZcEM2173kXEDbKIZrlX508qSv+CVydHz3w6FFPFwC0CtaCa/TqDQYDmHQdI1oMlc07wWk=
  </HostId>
</Error>

我知道水桶是存在的.当我通过AWS Web GUI导航到此项目并双击它时,它会打开带有URL的对象,并且工作正常:

https://s3-us-west-2.amazonaws.com/[bucket-name-omitted]/[file-name-omitted].pdf?X-Amz-Date=20160808T141832Z&X-Amz-Expires=300&X-Amz-算法rithm=AWS4-HMAC-SHA256&X-Amz-Signature=[signature-omitted]&X-Amz-Credential=ASIAJKXDBR5CW3XXF5VQ/20160808/us-west-2/s3/aws4_request&X-Amz-SignedHeaders=Host&x-amz-security-token=[really-long-key]

所以我相信我在使用SDK时一定是做错了什么.

推荐答案

达斯汀,

您的代码正确,请仔细判断以下内容:

  1. 你的桶访问策略.

  2. 通过API密钥获得bucket权限.

  3. 你的API密钥和密码.

  4. 你的桶名和 keys .

Node.js相关问答推荐

根据我的测试,为什么在编写Varint代码方面,NodeJS要比Rust快这么多?

如何在Angular jest测试中调用Nodejs的垃圾收集? node v20的测试速度慢且内存泄漏

如何发送比特币BTC使用发送加密使用WIF密钥在 node ,js

车把模板引擎循环问题

将 POST 的 json 变量格式化为 lambda

在 Docker 容器内创建一个 cron 作业(job)来执行 run.js 文件中的函数

如何从mongoose 对象内嵌套的数组中提取数组元素?

dayjs的isSameOrAfter方法未按预期工作

与诗乃一起嘲笑奈克斯

Google App Engine 突然不允许我部署我的 node.js 应用程序

强制 TypeScript 生成带有.js扩展名的导出/导入;运行 node 16?

WSL2 上需要脚本运行的 NPM 包的权限被拒绝

MERN 堆栈项目中的 React [create-react-app] 正在提供依赖项

Ansible 将以什么用户身份运行我的命令?

使用 Node.JS,如何按时间顺序获取文件列表?

安全沙箱并执行用户提交的 JavaScript?

JSHint 是否支持异步/等待?

所有的javascript回调都是异步的吗?如果不是,我怎么知道哪些是?

为什么 Node 控制台不显示功能代码?

`return function *(){...}` 是什么意思?