node.js - aws s3 node js sdk方法generatePutUrl为本地主机和heroku上的部署返回不同的结果

标签 node.js amazon-web-services heroku amazon-s3 image-uploading

我正在尝试根据heroku recomendations管理直接文件上传到S3

  1. 第一个需要在服务器上生成预签名 URL
  2. 在客户端中使用此网址将图像从浏览器直接上传到 S3 存储桶

最终成功在本地运行。 但是当我尝试在 Heroku 上部署服务器时,它开始失败,没有任何原因或可读错误。当我尝试打印它时,只是常见错误和奇怪的消息 response error message in console

当我从本地主机或从heroku调用电话时,预签名的网址完全不同,这对我来说看起来很奇怪 本地主机的响应如下所示:

https://mybucket.s3.eu-west-1.amazonaws.com/5e3ec346d0b5af34ef9dfadf_avatar.png?AWSAccessKeyId=<AWSKeyIdHere>&Content-Encoding=base64&Content-Type=image%2Fpng&Expires=1581172437&Signature=xDJcRBiA%2FmQF1qKhBZrnhFXWdaM%3D

heroku 部署的响应如下所示:

https://mybucket.s3.u-west-1.amazonaws.com/5e3ee2bd1513b60017d85c6c_avatar.png?Content-Type=image%2Fpng&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=<credentials-key-here>%2F20200208%2Fu-west-1%2Fs3%2Faws4_request&X-Amz-Date=20200208T163315Z&X-Amz-Expires=900&X-Amz-Signature=<someSignature>&X-Amz-SignedHeaders=content-encoding%3Bhost

服务器代码几乎与示例中类似:

const Bucket = process.env.BUCKET_NAME
const region = process.env.BUCKET_REGION

AWS.config = new AWS.Config({
accessKeyId: process.env.S3_KEY,
secretAccessKey: process.env.S3_SECRET,
region,
logger: console
})

const s3 = new AWS.S3()

async function generatePutUrl(inputParams = {}) {
  const params = { Bucket, ...inputParams }
  const { Key } = inputParams    
  const putUrl = await s3.getSignedUrl('putObject', params)
  const getUrl = generateGetUrlLocaly(Key)

  return {putUrl, getUrl}
}

我能想象到的唯一区别是 SSL - 我通过 http 运行本地服务器,而 heroku 默认情况下通过 https...

但我不明白它会如何影响这里。 我将不胜感激任何有意义的建议如何调试和修复它。 谢谢。

最佳答案

您的存储桶区域似乎不正确。难道不应该是 eu-west-1 而不是 u-west-1 吗?

关于node.js - aws s3 node js sdk方法generatePutUrl为本地主机和heroku上的部署返回不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60129464/

相关文章:

node.js - 如何在 NodeJS 中编写双向双工流

angularjs - MomentJS 下一个 15 日

php - 如何调试 AWS Cloudfront 签名 URL 访问被拒绝?

ruby-on-rails - 我可以将 cassandra 与 heroku 一起使用吗?

ruby - Heroku db:push error Sequel::AdaptorNotFound -> LoadError: 没有要加载的文件 -- pg

javascript - node.js中tls模块的newSession事件返回的session id类型

node.js - 如何用 Jest 设置媒体查询?

mongodb - 我无法从外部连接到 mongo-express

python - 使用 Python Lambda 处理 AWS Step Function 中的意外错误的最佳实践是什么?

Heroku:如何在部署期间在 Heroku 中的 python 应用程序上运行 npm build?